c语言 - 如何使 malloc 到另一个结构内部的结构?



在第一个.h文件中,我有这个结构:

typedef struct system
{
char* name;
DArray Info;
} *System;

.c文件中,我有这个功能:

System createSystem(char *name){
if (!name){
return NULL;
}
System newSystem=malloc(sizeof(*newSystem));
if (!newSystem){
return NULL;
}
newSystem->name=malloc(sizeof(strlen(name)+1));
if (!newSystem->name){
free(newSystem);
return NULL;
}
strcpy(newSystem->name,name);
newSystem->Info=malloc(sizeof *(newSystem->Info));
if (!newSystem->Info){
free(newSystem->name);
free(newSystem);
return NULL;
}
newSystem->Info->x=0;
newSystem->Info->elements=NULL;
return newSystem;
}

在另一个.h文件中,我有struct dArray

typedef struct dArray
{
int x;
Element *elements;
} *DArray;

Element可以是任何类型的。

但是,该函数总是在 Eclipse 中停止工作,我收到错误

硬件停止工作

我知道问题出在这一行:

newSystem->Info=malloc(sizeof(*newSystem->Info));

但我不明白为什么这是一个问题,因为我试图以常规方式向struct DArraymalloc!

我一直在主文件中使用此测试:

int main() {
sys=createSystem("ss1");
if (sys) {
printf ("ok");
return 0;
}

任何帮助将不胜感激。

System createSystem(char *name){
if (!name){
return NULL;
}
System newSystem=malloc(sizeof *newSystem);
if (!newSystem){
return NULL;
}
newSystem->name=malloc(sizeof *newSystem->name * (strlen(name)+1)); // <-- change here.
if (!newSystem->name){
free(newSystem);
return NULL;
}
strcpy(newSystem->name,name);
newSystem->Info=malloc(sizeof *newSystem->Info);
if (!newSystem->Info){
free(newSystem->name);
free(newSystem);
return NULL;
}
newSystem->Info->x=0;
newSystem->Info->elements=NULL;
return newSystem;
}

如果你将字符串复制到动态分配的内存,它(malloc)基本上分配sizeof (strlen(str)+1)字节的内存。这只不过是应用于size_tsizeof运算符,它不太可能容纳字符串。(我的机器中有 5 个字符)。 (为什么size_t?因为函数 strlen 有一个签名size_t strlen(const char *s);)

同样在我的系统中sizeof size_t是 4 个字节。所以基本上你分配了 5 个字节。这意味着字符串将由 5 个字符组成,包括 NUL 终止字符。

任何超过长度的东西都像"ABCDED",你正在写出你分配的内存,导致非法的内存访问 - 这有未定义的行为。在您的情况下,它只是停止。

为了补充更多说明,在您的情况下,我想当您输入字符串时,您传递的内容不仅仅是长度4.但是如果你传递字符串"ss1"那么这将起作用。

newSystem->name=malloc(sizeof *newSystem->name * (strlen(name)+1));可以更清楚地写成newSystem->name=malloc(strlen(name)+1);.由于sizeof char1字节,因此我们避免了它。

您稍后可以尝试查找不属于 ISO 标准strdup函数。

此外,以下内容根本不是您所追求的: newSystem->name=malloc(sizeof(strlen(name)+1));

这将使malloc()成为(最小)sizeof(size_t)的缓冲区,而不是能够容纳strlen(name)+1字节的缓冲区 - size_t是strlen的返回类型,这就是sizeof所应用的。

下面的陈述不正确:-

System newSystem=malloc(sizeof(*newSystem));应该是系统newSystem=malloc(sizeof(struct system));

newSystem->Info=malloc(sizeof *(newSystem->Info));newSystem->Info是指针? 如果指针,它应该是newSystem->Info=malloc(sizeof(DArray));

相关内容

  • 没有找到相关文章

最新更新