繁体   English   中英

为c中的结构分配内存

[英]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 ,后者在一个命令中执行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终止的字符序列的指针。

当你malloc与结构char *内不指向任何地方(至少是NULL )所以你要malloc它作为字符也是正常的,因为序列必须知道目标字符串的大小。 您可以使用mallocstrcpy或只使用strdup

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM