2017-04-08 39 views
1

關於這個問題有很多話題,但是我一直沒能找到適合我的解決方案;每當我嘗試更改student_t.member-> name時,我都會遇到分段錯誤。下面是我需要使用的typedef結構:用C語言編程:修改struct的成員值給出段錯誤

typedef struct degree_t degree_t; 
typedef struct student_t student_t; 

struct degree_t { 
    student_t* member; 
    int course_id; 
} 

struct student_t { 
    char* name; 
    int age; 
} 


int main(int argc, char* argv[]) { 

    student_t *students = malloc(sizeof(student_t) * 3); 
    degree_t *degrees = malloc(sizeof(degree_t)); 

    for (int i=0; i<3; i++) { 
     degrees[i].course_id = 1; 
     degrees[i].member->name = "Bob"; 
    } 
    return 0; 
} 

我可以改變度[I] .course_id完美的罰款,但每當我試圖改變度[I]。成員 - >名字,我得到一個分段故障。

GDB表明這是行度[i] .member-> name =「Bob」的結果,但我不明白爲什麼,並且我不知道如何有效更改值度[i] .member->名稱

+0

確保爲所有* *指針,包括你的'struct's內部分配內存。順便說一句,寫得很好,再加上一個。 – Bathsheba

+0

謝謝!我希望閱讀這本書不會太過噩夢。但是我對分配略有困惑 - 哪些指針錯過了爲內存分配? –

回答

2

糟糕,您設法在該小程序中放置四個錯誤。

  1. main()的簽名應該是main(int argc, char *argv[])。 argv是在命令行上找到的字符串的數組
  2. 您爲內存分配一個度數,但在for循環中初始化其中三個內存。這導致堆腐敗。
  3. 您不初始化度 - >成員,但使用它。
  4. 您爲三名學生分配內存,但不要使用它。

試試這個:

struct degree_t { 
    student_t* member; 
    int course_id; 
} 

struct student_t { 
    const char* name; 
    int age; 
} 


int main(int argc, char* argv[]) { 
    degree_t *degrees = malloc(3 * sizeof(degree_t)); 

    for (int i=0; i<3; i++) { 
     degrees[i].course_id = 1; 
     degrees[i].member = malloc(sizeof(student_t)); 
     degrees[i].member->name = "Bob"; 
     degrees[i].member->age = 23; 
    } 
    return 0; 
} 
+0

非常感謝您的回答!它現在工作完美 - 我是內存分配的新手,所以(可以告訴)我不太擅長。 並感謝您更正argv參數!我已經編輯了關於這個的原始文章,因爲我的程序確實包含了argv [],但是當我寫我的文章時我忽略了這一點。 –

+0

argv []問題與您不使用命令行參數不相關。你甚至可以寫'void main(){...}',這是錯誤的,但仍然有效。 – user5329483

+0

因爲參數被忽略,所以使用'int main(void)'是明智的。微軟只允許使用'void'作爲返回類型。在類UNIX系統上,void main(void)是無條件錯誤的。 –