我正在学习C语言。任何人都可以帮助我理解以下结果:
int main()
{
struct xx
{
int x;
char name[];
};
struct xx *s;
printf("%d",s->x);
printf("%s",s->name);
return 0;
}
输出: - 分段错误
我写了另一个代码:
struct Foo
{
char *pName;
};
int main()
{
struct Foo *obj = malloc(sizeof(struct Foo));
strcpy(obj->pName,"Your Name");
printf("%s", obj->pName);
return 0;
}
输出:分段错误(核心转储);
为什么我会出现分段错误?代码有什么问题? core dumped是什么意思?
答案 0 :(得分:5)
main()
应具有标准格式(int main(void)
)并返回int
值s
obj
pName
struct Foo
答案 1 :(得分:1)
为结构声明了一个指针,但是从不初始化指针,也从不创建任何结构。 s
指向一些随机存储空间,从您尝试读取的内容开始。
在第二种情况下,您有一个从未分配过内存的指针pName
。它还指向随机存储空间。您是从字符串文字进行字符串复制并写入随机存储器位置。
答案 2 :(得分:0)
在示例1中,您声明了一个指针但尚未初始化它。因此,指针指向未知位置。
在示例2中,obj-> pname出于同样的原因指向内存的未知部分(它未初始化),因此尝试在strcpy内部访问它会使程序崩溃。
你应该做什么:你应该为指针分配一些内存,使它们指向属于你的内存而不是一些随机(非法?)内存部分
答案 3 :(得分:0)
#include <stdio.h>
#include <stdlib.h>
int main()
{
struct xx
{
int x;
char name[25]; /* mention size of array */
};
struct xx *s;
s=(struct xx *)malloc(sizeof(struct xx)); /* allocate the size for pointer variable */
printf("Enter the value\n");
scanf("%d",&s->x); /*get the value */
printf("Enter the name\n");
scanf("%s",s->name);
printf("%d\n",s->x); /*get the value */
printf("%s\n",s->name);
return 0;
}
答案 4 :(得分:0)
您已声明指针变量但尚未为其分配内存
要在strict xx *S;
S=(struct xx*) malloc(sizeof(strict xx));
并声明char name[30]
的第一个尺寸;
答案 5 :(得分:0)
首先,您需要分配变量s的大小,因为您的编译器不了解它应该分配给变量的内存大小。这就是为什么你需要分配内存为: S =(struct xx *)malloc(sizeof(struct xx));
答案 6 :(得分:0)
好的,...在您的第一个代码中,您还没有为 ss 变量分配内存,而您正在访问它的值,因此它会生成分段错误。
在第二个,,, pName 是一个字符指针..所以你不能在strcpy()函数中使用它......
答案 7 :(得分:0)
结构中的指针在使用时不会初始化(称为野指针)。即使指针已经初始化,它仍然指向有效的存储区域。
学习C语言时,记忆操作是最重要的。