gpt4 book ai didi

c - 使用包含多个元素的结构的 malloc

转载 作者:太空宇宙 更新时间:2023-11-04 00:29:43 26 4
gpt4 key购买 nike

我在这里做错了什么?

我有一个 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 '\0' 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=NULLfree(NULL)要求什么也不做,正常返回。

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

关于c - 使用包含多个元素的结构的 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27819115/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com