我使用雙向鏈接列表編寫經典的Snake遊戲,並編寫了一個函數,該函數創建一個指針,爲結構分配所需空間,然後分配內存給列表中的下一個指針等等。最後,指向第一個元素的指針由函數返回,並且可以分配給主函數中的頭指針。初始化for循環中的雙向鏈接導致崩潰
當開始遊戲時,我希望蛇的長度爲3,所以我在函數中使用了三個malloc,並使用了指針,指針 - >下一個,指針 - >下一個 - >下一個等,並且一切正常。
由於很多步驟都在這個過程中,我認爲把所有這一切到一個for循環這樣的重複:
#include <stdio.h>
#include <stdlib.h>
typedef struct snake snake;
struct snake {
int x; /* x coordinate */
int y; /* y coordinate */
snake *previous;
snake *next;
};
snake *initSnake(void) {
snake *pointer, *tmp1, *tmp2 = NULL;
/* three iterations, so the snake will have a length of three */
for(int i = 0; i<3; i++, tmp1 = tmp1->next) {
if(NULL == (tmp1 = (snake*)malloc(sizeof(snake)))) {
return NULL;
}
/* coordinates */
tmp1->x = 20;
tmp1->y = 10 + i;
/* first previous points to NULL */
tmp1->previous = tmp2;
/* temporarily store last pointer to be used for next previous pointer */
tmp2 = tmp1;
if(0 == i) {
/* store first pointer so it can be returned */
pointer = tmp1;
}
}
/* the last next pointer has to point to NULL */
tmp1 = NULL;
/* now return the pointer to the first element in list */
return pointer;
}
int main() {
/* pointer to first element in list */
snake *head = NULL;
if(NULL == (head = initSnake())) {
fprintf(stderr, "Not enough memory!\n");
return EXIT_FAILURE;
}
/* here everything works fine */
printf("%d\n", head->y);
printf("%d\n", head->previous);
/* when trying to acces the content of the next element, the program crashes... */
printf("%d\n", head->next->x);
/* pause */
getchar();
}
的問題是,當我嘗試訪問的第二個元素主要功能內的列表,遊戲崩潰。我懷疑在for循環中 tmp1 = tmp1->next
有什麼問題,我不能真正訪問下一個指針,但我不完全確定。
你能幫我嗎?
可能設置tmp1->未來= NULL會有所幫助,或撥打釋放calloc代替的malloc。並且不要強制malloc的返回值。 – bruceg
@bruceg爲什麼不投放malloc的返回?我很少看到它,但我的教授在做C講座時堅持要這樣做。 – user1662035
http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc – bruceg