在第一个.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 DArray
malloc!
我一直在主文件中使用此测试:
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_t
sizeof
运算符,它不太可能容纳字符串。(我的机器中有 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 char
1
字节,因此我们避免了它。
您稍后可以尝试查找不属于 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));