#include<stdio.h>
int c;
int main()
{
struct abc{
int *a;
char *ch[10];
};
struct abc obj1;
struct abc *obj;
obj = & obj1;
scanf("%d",obj->a);
printf("\nY");
scanf("%s",&obj->ch);
printf("\nY");
return 0;
}
我在Fedora上使用VIM编辑器和Gcc编译器。 我得到了一个SEGMENTATION FAULT(CORE DUMPED ??)//这意味着什么?
答案 0 :(得分:5)
“Segementation fault”表示您的程序试图访问不允许的内存。您的程序有几个指针和初始化错误。
我认为您希望您的数组为char ch[10]
,而不是char *ch[10]
。您还需要将scanf()
来电更改为匹配:scanf("%s", obj->ch);
。
a
字段也是如此。它可能不应该是指针,你应该将指针传递给scanf()
:
scanf("%d", &obj->a);
答案 1 :(得分:2)
我得到了一个SEGMENTATION FAULT(CORE DUMPED ??)//这意味着什么?
执行内存访问冲突的变量会导致分段错误。
scanf("%d",obj->a);
int *a;
- struct member a
是一个未初始化的指针,但是尝试将输入传递到它指向的位置。导致分段错误。
obj->a = malloc(sizeof(int)) ;
现在您可以获取a
指向位置的输入。
scanf("%d", &(obj->a) );
使用您执行的输入操作,struct定义不需要原始指针 -
struct abc{
int *a; // Change this to int a; or make a point to a valid memory location
char *ch[10]; // Change this to char ch[10]; or initialize it with pointers pointing to a valid memory locations
// and then take input on to pointer pointing location.
};
注意两者之间的区别 -
int a ; // Can take input directly to "a"
int *a ; // First "a" must point to a valid memory location that can hold an int
// Then, can take input to "a" pointing location
答案 2 :(得分:1)
扩展Carl的答案:char *ch[10]
创建一个包含10个字符指针的数组。你想要的是一个10个字符的数组。
答案 3 :(得分:0)
您的代码调用未定义的行为。
您应该char ch[10];
并使用预设宽度的scanf以避免溢出
scanf("9%s",&obj->ch);
更多:http://www.cplusplus.com/reference/clibrary/cstdio/scanf/
结构被定义为具有指向int的指针,它永远不会初始化,因此指向随机位置,因此写入您不拥有的内存位置,因此UB
。将其切换为局部变量int a
或malloc()
整数。