2011-12-14 86 views
1

我犯了这样的一个结构:的malloc在C,结构

struct a{ 
    char *name; 
    char *value; 
    struct a *next; 
}; 

时,我的malloc在第一次内存,没关系,我可以设置“名称”和“价值”的相应值。 但是当我第二次malloc时,错误来了。这是一个CGI,只是告诉我“500内部服务器错误”。

我将指针'name'和'value'改为数组,一切正常。

我想也许编译器不知道要分配多少内存。

你有什么想法吗?我会感谢每一个答案!

+5

你将不得不展示更多的代码 - 你直接存储在值`a-> name`或`a-> value`中,还是为_them_分配内存? – sarnold 2011-12-14 01:41:26

+0

我直接存储值而不分配内存。正如Keith Thompson评论的那样,我为a-> name和a-> value分配内存,它的工作原理。你知道这有什么区别吗?谢谢! – trinity 2011-12-14 03:22:57

回答

2

如果您使用mallocsizeof(struct a)它只是分配足够的空间来存储指针的名称和值。你希望这些是char数组,然后它会知道为每个a的实例预留了多少空间。

+0

谢谢你,LaceySnr。你比我有更好的理解。这变得很清楚。 – trinity 2011-12-14 02:12:45

3
struct a { 
    char *name; 
    char *value; 
    struct a *next; 
}; 

struct a *head = malloc(sizeof *head); 

单个struct a对象上面的分配空间,但它不初始化任何HTE的包含在struct a三个指针。特别是,如果你想namevalue指向字符串,则需要对这些字符串分配空间:

head->name = malloc(5); 
strcpy(head->name, "Fred"); 
head->value = malloc(8); 
strcpy(head->value, "abcdefg"; 

这大大简单化。 58是“幻数”;如果更改初始值,应该以保持一致的方式指定大小。你应该总是检查malloc()是否返回一个空指针(即使你只是用一个错误信息终止程序)。

如果不初始化namevalue指向分配的内存块一些,你威力仍然能够初始化它们指向什么(例如,通过执行上面的strcpy•不用的malloc S)。更确切地说,系统不一定会诊断错误。

最后,您需要致电free()对应每个malloc()调用。

请注意,这主要是根据您的描述猜测。如果您可以向我们显示您的实际代码,我们可以帮助您更好。