Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c中的malloc,struct_C_Struct_Malloc - Fatal编程技术网

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”