2017-04-14 308 views
0

指針和數組我真的很不愉快,我真的需要幫助。C指針結構數組指針

有是有這個結構的練習:

typedef struct student_node{ 
    unsigned number; 
    const char *name; 
    unsigned class; 
    struct student_node *next; 
} StudentNode; 

,我要實現這個功能:

void groupStudentByClass(StudentNode *classes[], StudentNode students[], size_t num_students) 

我的問題是,我想改變的東西像類和打印數量價值,我不能。它給了我「分段錯誤(核心轉儲)」。但我不明白爲什麼...

這是測試代碼:

size_t nClasses=3; 
StudentNode *classes [nClasses]; 
classes[0]->number=0; 
printf("%u\n",classes[0]->number); 

順便說一句,我不能使用malloc和東西分配內存。

+0

在stackoverflow.com上,當詢問有關運行時問題的問題時(因爲此問題正在執行),有一定的要求。發佈實際輸入,發佈實際輸出,發佈預期輸出,發佈簡短,完整,乾淨地編譯仍然存在問題的代碼。在這種情況下,發佈代碼的要求未得到滿足。關於代碼沒有得到滿足的要求使得這個問題脫離了主題。 – user3629249

回答

0

@Matthias已經解釋了爲什麼你所得到的SEGV這樣做什麼。

如果你不能使用malloc,那麼你需要預先分配結構。像

const size_t MAX_STUDENT = 1024; 
StudentNode studentPool[MAX_STUDENT]; 
int studentLast = -1; 

東西然後你需要日常

StudentNode* StudentGet() 
{ 
    if (++studentLast >= MAX_STUDENT) 
    { 
     /* Print error message and exit */ 
    } 
    return studentPool[studentLast]; 
} 

接下來的分配,當你需要分配

classes[0] = StudentGet(); 

然後,你可以做你的作業和打印。

您可能還需要編寫例程以釋放結構並將其返回到池中。

+0

謝謝。隨着你的回答,我想我知道我必須做什麼。我有一個指向nClasses結構體的指針數組。因爲它們都是指針,而且它們只在只讀部分。所以我必須用下一個指針指向學生。這部分在我的大腦中仍然沒有好好燃燒,但我想我已經得到了它。再一次感謝你:) –

0
StudentNode *classes [nClasses]; 

僅創建3個指針。但他們沒有指向任何東西。 因此

classes[0] 

在內存中不存在。

我想,你應該使用你的函數參數得到的指針。

+0

謝謝。隨着你的回答,我想我知道我必須做什麼。我有一個指向nClasses結構體的指針數組。因爲它們都是指針,而且它們只在只讀部分。所以我必須用下一個指針指向學生。這部分在我的大腦中仍然沒有好好燃燒,但我想我已經得到了它。再一次感謝你:) –

0

這條線:

StudentNode *classes [nClasses]; 

分配一個3個指針的數組,但這些指針是NULL充其量(更糟的是,它們可以含有任意的垃圾)。即使你不能使用malloc(我想這是作業的一部分),你可以把你的student_node結構棧上,像這樣:

StudentNode s0 = { 
    .number = 0, 
    .name = "Alice", 
    .class = 0, 
}; 

StudentNode s1 = { 
    .number = 1, 
    .name = "Bob", 
    .class = 0, 
}; 

StudentNode s2 = { 
    .number = 2, 
    .name = "Peter", 
    .class = 0, 
}; 

然後把它們連在一起:

s0.next = &s1; 
s1.next = &s2; 
// leave s2.next NULL 

然後,最後,您可以指定在鏈classes[0]第一個學生:

classes[0] = &s0; 
+0

謝謝。隨着你的回答,我想我知道我必須做什麼。我有一個指向nClasses結構體的指針數組。因爲它們都是指針,而且它們只在只讀部分。所以我必須用下一個指針指向學生。這部分在我的大腦中仍然沒有好好燃燒,但我想我已經得到了它。再次感謝你:) –

0

我覺得你不需要一個指向類的指針。你真的想在您的測試代碼,這樣做會

size_t nClasses=3; 
StudentNode classes [nClasses]; 
classes[0].number=0; 
printf("%u\n",classes[0].number); 

此外,由於你不能使用malloc我建議的認定中

typedef struct student_node{ 
    unsigned number; 
    const char name[100]; // or whatever max name size you want 
    unsigned class; 
    struct student_node *next; 
} StudentNode; 
+0

謝謝。隨着你的回答,我想我知道我必須做什麼。我有一個指向nClasses結構體的指針數組。因爲它們都是指針,而且它們只在只讀部分。所以我必須用下一個指針指向學生。這部分在我的大腦中仍然沒有好好燃燒,但我想我已經得到了它。再次感謝你:) –