2011-03-30 252 views
1
#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編譯.. 我得到一個分段錯誤(內核傾倒?)//這是什麼意思?結構指針

+0

下次請格式化您的代碼。 – 2011-03-30 19:02:20

回答

5

「Segementation fault」表示您的程序嘗試訪問不允許的內存。你的程序有幾個指針和初始化錯誤。

我想你想要你的陣列是char ch[10]而不是char *ch[10]。您還需要更改scanf()呼叫以匹配:scanf("%s", obj->ch);

您的a字段也是如此。它可能不應該是一個指針,你應該通過一個指針scanf()

scanf("%d", &obj->a); 
+0

我相信'a'字段沒問題。 'scanf'將期望地址爲該實例中的整數,並且因爲'a'本身就是一個指向整數的指針(地址),所以它可以正常工作。但是,除非你有理由,否則可能最好只做一個'int',然後按照你提到的那樣傳遞它的地址。 – Anthony 2011-03-30 19:09:37

+1

@Shynthriir - 它絕對是*不*很好的方式。 'a'是一個指針,但它並不指向任何東西! – 2011-03-30 19:10:21

+0

好的,對不起,他必須先爲它分配內存。我試圖做的一點是,將(分配的)指針傳遞給int或將地址傳遞給int不應有所作爲。 – Anthony 2011-03-30 19:12:27

2

我得到一個分段錯誤(內核傾倒?)//這是什麼意思?

執行內存訪問衝突結果分段錯誤的變量。

scanf("%d",obj->a); 

int *a; - 結構構件a是未初始化的指針,但試圖採取到它指向的位置輸入。導致你分段錯誤。現在

obj->a = malloc(sizeof(int)) ; 

你可以把輸入a指向的位置。

scanf("%d", &(obj->a)); 

隨着你執行類型的輸入操作,結構定義可以不需要原始指針 -

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 
+0

不應該是'scanf(「%d」,obj - > a)'? 'a'是一個指針,所以它本身就包含一個地址。 – aandis 2016-02-10 19:06:11

1

擴大對卡爾的回答:char *ch[10]創建一個由10個指向角色的指針組成的數組。你想要的是一個10個字符的數組。

0

您的代碼調用未定義的行爲。

你應該有char ch[10];和使用scanf函數具有預設寬度以避免溢出

scanf("9%s",&obj->ch); 

更多:http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

的結構被定義爲具有一個指針到整型,你永遠不會初始化,因此指向隨機位置,因此寫入你不屬於的記憶位置,因此UB。將其切換到局部變量int amalloc()一個整數。