c - 为c中的结构分配内存

标签 c heap-memory

struct data{
char *key;
char *fname;
char *lname;
char *grade;
struct data *next;
};


 newnode = (struct data*)malloc(sizeof(struct data));
 strcpy(newnode->lname,lname);
 strcpy(newnode->grade,grade);
 strcpy(newnode->key,key);
 strcpy(newnode->fname,fname);
 newnode->next=NULL;

所以我在研究哈希表。上面的代码在

struct data *newnode;
newnode = (struct data*)malloc(sizeof(struct data));
newnode->lname=(char*)malloc(strlen(lname)+1);
newnode->fname=(char*)malloc(strlen(fname)+1);
newnode->grade=(char*)malloc(strlen(grade)+1);
newnode->key=(char*)malloc(strlen(key)+1);

strcpy(newnode->lname,lname);
strcpy(newnode->grade,grade);
strcpy(newnode->key,key);
strcpy(newnode->fname,fname);
newnode->next=NULL;

此代码似乎可以运行。这是为什么?据我所知,我已经在堆中为我的结构分配了内存。为什么我必须专门为每个对象做这件事?我还缺少其他东西吗?因为我真的不明白为什么下面的例子会起作用。

最佳答案

newnode = (struct data*)malloc(sizeof(struct data)) , 你只为 struct data 分配内存,这是一组指针,但您不会为这些指针指向的位置以及您将字符串复制到的位置分配任何内存。所以你必须为每个字符串单独分配内存,或者使用 malloc正如你问题的第二部分,或者使用 strdup , 这确实 mallocstrcpy在一个命令中:

struct data{
char *key;
char *fname;
char *lname;
char *grade;
struct data *next;
};


 newnode = (struct data*)malloc(sizeof(struct data));
 newnode->lname = strdup(lname);
 newnode-> grade = strdup(grade);
 newnode-> key = strdup(key);
 newnode-> fname = strdup(fname);
 newnode->next=NULL;

值得注意的是 strdup需要一个字符串作为输入,即一个不是 NULL 的指针并且指向 \0 -终止的字符序列。

关于c - 为c中的结构分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44277048/

相关文章:

C 程序未按预期运行,输入后挂起

Tomcat 未启动 : Not able to reserve enough space for object heap

linux - 带有 tomcat7 的 Arquillian 遇到 Java 堆空间问题,仅在 linux 上

c++ - 我不明白为什么这个程序会打印 8762 作为结果

c - 如何获取输入提示用户输入两个字符并使用它们进行交换?

c - 为什么 strstr 在我的 C 程序中似乎不起作用?

c - C 中的多维数组出现错误

java - hibernate 查询内存不足 128MB

c++ - 这些是堆栈分配还是堆分配?

c - 我们在用户输入过程中使用 & 符号,但为什么我们在 C 中的赋值过程中不需要它?