为C中带有字符指针的结构分配内存
我今天正在努力修复一个代码,然后我遇到了类似的情况:为C中带有字符指针的结构分配内存,c,pointers,memory,struct,malloc,C,Pointers,Memory,Struct,Malloc,我今天正在努力修复一个代码,然后我遇到了类似的情况: typedef struct { int a; int b; int c; int d; char* word; } mystruct; int main(int argc, char **argv){ mystruct* structptr = malloc(sizeof(mystruct)); if (structptr==NULL) { printf("ERROR!") ...
typedef struct {
int a;
int b;
int c;
int d;
char* word;
} mystruct;
int main(int argc, char **argv){
mystruct* structptr = malloc(sizeof(mystruct));
if (structptr==NULL) {
printf("ERROR!")
...
}
...
free(structptr);
return 0;
}
由于
char*word
是一个长度可变的字符串,并且malloc没有为其分配足够的内存,因此代码给出了大量内存错误。事实上,它只为整个结构分配了20个字节。有没有办法解决这个问题,而不将char*
转换成类似char-word[50]
?您只为结构本身分配内存。这包括指向char的指针,在32位系统上只有4个字节,因为它是结构的一部分。它不包括未知长度字符串的内存,所以如果您想要一个字符串,您还必须手动为该字符串分配内存。如果只是复制字符串,可以使用分配和复制字符串的strdup()
。不过,你仍然必须自己释放内存
mystruct* structptr = malloc(sizeof(mystruct));
structptr->word = malloc(mystringlength+1);
....
free(structptr->word);
free(structptr);
如果您不想自己为字符串分配内存,那么您唯一的选择就是在结构中声明一个固定长度的数组。然后它将成为结构的一部分,
sizeof(mystruct)
将包含它。这是否适用,取决于您的设计。为word
mystruct* structptr = malloc(sizeof(mystruct));
structptr->word = malloc(sizeof(char) * N);
使用word=malloc(128)代码>
这将为可变字分配128个字节,当为structptr
分配内存时,struct
中的指针word
没有指向的有效内存。因此,您也可以使用malloc
为word
分配一段内存,或者将word
指向另一个字符。正如您所理解的,您需要分别分配字符*
:
mystruct* structptr = malloc(sizeof(mystruct));
structptr->word = malloc(sizeof(WhatSizeYouWant));
malloc外部结构将只分配由*word
指向的1字节内存,因为它是“char*”类型。如果要分配由word
指向的超过1字节的内存,有2个选项:
就像你说的,把它声明为char-word[50]
而不是'char*'
malloc/calloc(我个人更喜欢calloc,省去了zeromemory的麻烦,这是一个非常重要的..)外部结构,然后malloc/calloc也是内部的单词。在这种情况下,记得同时拨打两次免费电话
@H2CO3,我不认为Devulus欣赏你的观点。@JackCColeman,特别是因为critzize没有提供任何信息是错误的,这不是很有建设性的。@Devulus,要说H2CO3的功劳,我想他实际上是在和hhachem说话,或者像我一样挖苦人@杰克曼,噢!我以为他是在给我写信,因为这是对我帖子的评论反之亦然。如果长度未知,则必须动态分配内存,除非可以对stringlength设置上限。当然,您也应该添加代码,以确保在这种情况下不超过固定长度(并且在处理字符串时不要忘记考虑<代码> 0)/代码>字节。因此,如果您说字符串不能超过50+1,那么数组更容易维护。您看到了注释,但随后将其删除。请使用更多信息编辑您的问题或提交第二个问题。有一些方法可以处理长度变化的char
向量。我添加了注释,然后在下面的注释中找到了答案。我相信,固定的缓冲区大小实际上是最好的解决方案,因为word将代表一个名称,而名称不应该像小说那么长;)。谢谢你的帮助。我只是很好奇为变量字符串分配内存,这就是为什么我问这个问题。但我还是打算改用固定长度的数组。现在空间(即RAM)很充足,所以在大多数情况下,定义1024个字符的数组不会产生问题。I/O缓冲区通常比这个大得多。@hhachem您显然不太理解指针。请阅读有关指针和数组(例如)可能重复的