C语言 使用包含多个元素的结构的malloc



我在这里做错了什么?

我有一个 QueueElement 结构,其中包含一个 char* 文本和一个指向下一个元素的指针,所以显然是一个链表:

//QElement as in QueueElement
struct QElement {
    char* text;
    struct QElement* next;
};
typedef struct QElement QElement;

....

void enqueue (char* string){
QElement *new = (QElement *)malloc(sizeof(QElement)); 
//QElement cast is probably redundant but it doesn't hurt anyone
strcpy (new->text, string);
//some other stuff happening here, linking to other element in linked list, 
//but thats not of interest at the moment
}

....

如果我尝试在 main 函数中排队一个单词,我会不断收到分段错误,valgrind 告诉我,当我使用 strcpy 时我做错了什么,所以我的 malloc 似乎是不正确的。我该怎么做?

其他

答案推荐strdup(.)是非标准的。如果您不在Unix平台上,则可能无法使用。

然而,这一点是正确的。您需要分配内存来存储字符串。

尝试:

const size_t sz=(strlen(string)+1)*sizeof(*string);//Space required. Including '' terminator.
new->text=malloc(sz);//space allocated.
if(new->text==NULL){//sz never 0 because +1.
   exit(EXIT_FAILURE);//Allocation failed in non-error handled function.
}
memcpy(new->text,string,sz); //typically fastest way to copy!

而不是strdup(.).

我对sizeof(*string)的使用实际上是不必要的(因为它总是 1),但编译器会发现这一点,这只是很好的做法。

总有一天,世界将更均匀地移动到多字节字符,这段代码已经准备好迎接那个辉煌的黎明!

不要忘记在完成"QElement"时free(.)。您可能应该编写这样的函数:

void QElementDestroy(QElement*const element){
    if(element==NULL){
        return;//Nothing to do!
    }
    free(element->text);//Needs NULL protection.
    free(element);//Does not need NULL protection. But we've done the test anyway!
    //NB: Order matters here. A lot.
}

并在完成 enqueue(.) 返回的值时调用它。

如果您希望字符串在调用 destroy 之前element->text=NULL"实时"元素集。 free(NULL)需要什么都不做,正常返回。

PS:我认为strdup(.)有点像n00b陷阱。它们需要一段时间才能掌握匹配malloc(.)free(.)的窍门,strdup(.)有点叛徒,因为其他str...函数都没有分配调用者预期free(.)的空间。它也是非标准的。

在此

代码中

strcpy (new->text, string);

未分配内存new->text。它可能包含一些垃圾值,或一些写保护内存地址,甚至 NULL。将该指针传递给strcpy()将导致您出现未定义的行为,并且作为副作用,您可能会遇到分段错误。

您可以使用strdup(),也可以在strcpy() -ing 到该指针之前将内存分配给new->text。这两种情况,您都需要在之后free()分配的内存。

  1. 请不要强制转换 malloc() 的返回值。
  2. 在使用指针之前,请检查动态内存分配 [ malloc()/calloc()] 是否成功。

因为您只为结构变量分配内存。您必须在结构成员中分配内存。

 new->text=malloc(10);//for example 

分配内存后,您可以使用 strcpy 函数。

您已经为 new 分配了内存,但没有为 text 成员变量分配内存。为text分配内存并执行代码。

相关内容

  • 没有找到相关文章

最新更新