[英]Allocating memory for structures in c
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 = malloc(sizeof(struct data));
您只为实际结构分配内存。 但是由于结构包含指针,因此您需要使这些指针指向有效的地方。 单个malloc
调用对结构的内容一无所知,也不知道应为所有指针分配多少额外的内存。
例如,如果您声明一个普通的指针变量,您将不希望仅将其用作strcpy
调用的目标而不分配内存,是吗?
使用newnode = (struct data*)malloc(sizeof(struct data))
,您仅为struct data
(它是一组指针newnode = (struct data*)malloc(sizeof(struct data))
分配内存,但是对于这些指针所指向的位置以及您不指向的位置,您不分配任何内存。将您的字符串复制到。 因此,您必须为每个字符串分别分配内存,方法是在问题的第二部分中使用malloc
,或者使用strdup
,后者在一个命令中执行malloc
和strcpy
:
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
终止的字符序列的指针。
当你malloc
与结构char *
内不指向任何地方(至少是NULL
)所以你要malloc
它作为字符也是正常的,因为序列,你必须知道目标字符串的大小。 您可以使用malloc
和strcpy
或只使用strdup
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.