结构指针

时间:2011-03-30 19:01:34

标签: c

#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 ??)//这意味着什么?

4 个答案:

答案 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 amalloc()整数。