c中的malloc,struct
我制作了一个这样的结构:c中的malloc,struct,c,struct,malloc,C,Struct,Malloc,我制作了一个这样的结构: struct a{ char *name; char *value; struct a *next; }; 当我第一次为内存调用malloc时,它是正常的,我可以设置“name”和“value”一个对应的值。 但是当我第二次尝试时,错误就来了。这是一个cgi,只需显示“500内部服务器错误” 我将指针“name”和“value”更改为array,一切正常 我想也许编译器不知道分配多少内存 你对此有什么想法吗?我会感激你的回答 如果将malloc与sizeo
struct a{
char *name;
char *value;
struct a *next;
};
当我第一次为内存调用malloc时,它是正常的,我可以设置“name”和“value”一个对应的值。
但是当我第二次尝试时,错误就来了。这是一个cgi,只需显示“500内部服务器错误”
我将指针“name”和“value”更改为array,一切正常
我想也许编译器不知道分配多少内存
你对此有什么想法吗?我会感激你的回答 如果将
malloc
与sizeof(struct a)
一起使用,它只会分配足够的空间来存储指针的名称和值。如果您希望这些是字符数组,那么它将知道为a
的每个实例留出多少空间,如果您将malloc
与sizeof(struct a)
一起使用,它将分配足够的空间来存储指针名称和值。如果希望这些是字符数组,那么它就会知道为a
的每个实例留出多少空间
struct a {
char *name;
char *value;
struct a *next;
};
struct a *head = malloc(sizeof *head);
上面为单个结构a
对象分配空间,但它不会初始化结构a
中包含的三个指针中的任何一个。特别是,如果希望name
和value
指向字符串,则需要为这些字符串分配空间:
head->name = malloc(5);
strcpy(head->name, "Fred");
head->value = malloc(8);
strcpy(head->value, "abcdefg";
这是相当简单的<代码>5和8是“幻数”;如果更改初始值,则应以保持一致的方式指定尺寸。您应该始终检查malloc()
是否返回空指针(即使您只是用错误消息终止程序)
如果您没有初始化name
和value
以指向某个分配内存块,您可能仍然能够初始化它们指向的内容(例如,在不使用malloc
s的情况下执行上面的strcpy
s)。更准确地说,系统不一定会诊断错误
最后,您需要调用与每个malloc()
调用对应的free()
请注意,这在很大程度上是基于您的描述的猜测。如果您能向我们展示您的实际代码,我们可以更好地帮助您
上面为单个结构a
对象分配空间,但它不会初始化结构a
中包含的三个指针中的任何一个。特别是,如果希望name
和value
指向字符串,则需要为这些字符串分配空间:
head->name = malloc(5);
strcpy(head->name, "Fred");
head->value = malloc(8);
strcpy(head->value, "abcdefg";
这是相当简单的<代码>5和8是“幻数”;如果更改初始值,则应以保持一致的方式指定尺寸。您应该始终检查malloc()
是否返回空指针(即使您只是用错误消息终止程序)
如果您没有初始化name
和value
以指向某个分配内存块,您可能仍然能够初始化它们指向的内容(例如,在不使用malloc
s的情况下执行上面的strcpy
s)。更准确地说,系统不一定会诊断错误
最后,您需要调用与每个malloc()
调用对应的free()
请注意,这在很大程度上是基于您的描述的猜测。如果您可以向我们展示您的实际代码,我们可以更好地帮助您。您必须展示更多的代码--您是直接存储到值a->name
还是a->value
中,还是您也为它们分配了内存?我直接存储值而不分配内存。正如Keith Thompson所评论的,我为->名称和->值分配内存,这是有效的。你知道区别吗?非常感谢。您必须显示更多的代码——您是直接存储到值a->name
还是a->value
中,还是您也为它们分配了内存?我直接存储值而不分配内存。正如Keith Thompson所评论的,我为->名称和->值分配内存,这是有效的。你知道区别吗?非常感谢。谢谢你,莱西。你比我更了解我。我明白了。谢谢你,莱西。你比我更了解我。我明白了。是的,你是对的。我刚刚测试了你的方法。它起作用了。但是还有一个问题,当你使用head->name=malloc(5)
时,你必须知道你想要malloc的大小。所以过程是:计算长度,然后是malloc。但我不认为这是效率。再次感谢你!如何计算长度取决于数据来自何处。如果有一个名为name
的char*
指针指向要用作名称的字符串,则可以执行head->name=malloc(strlen(name)+1);如果(head->name==NULL){/*句柄分配失败*/}strcpy(head->name,name)代码>。例如(保存终止字符串的'\0'
空字符需要+1
)这里我想解析qeury字符串,如“search=stackoverflow&keyword=malloc&language=en&else=null”。所以我找不到一个有效的方法来做这件事。是的,你是对的。我刚刚测试了你的方法。它起作用了。但是还有一个问题,当你使用head->name=malloc(5)
时,你必须知道你想要malloc的大小。所以过程是:计算长度,然后是malloc。但我不认为这是效率。再次感谢你!如何计算长度取决于数据来自何处。如果有一个名为name
的char*
指针指向要用作名称的字符串,则可以执行head->name=malloc(strlen(name)+1);如果(head->name==NULL){/*句柄分配失败*/}strcpy(head->name,name)代码>。例如(保留终止字符串的'\0'
空字符需要+1
)这里我想解析qeury字符串,如“search=stackoverflow&keyword=ma”