我打算寫一個簡單的SDL應用程序,所以我認爲我應該實現一個簡單的鏈接列表,以便以後擴展。在經過一番苦苦掙扎之後,我決定在這裏尋求幫助。爲什麼我的C鏈表失敗?
我知道鏈表,我讀過它。我看到了幾個實現,並不那麼難,容易掌握。所以我認爲我應該能夠自己實現一個。我猜測我在這裏嚴重忽略了一些東西。 :(
首先這個代碼不編譯好,分段錯誤。其次,我不認爲它會產生我想如果我能戰勝我與不幸的指針做基本的錯誤。
能否請你告訴我我的錯誤在我的代碼?我在哪裏做錯了嗎?
這裏是一個liveworkspace鏈接編輯 http://liveworkspace.org/code/1qu1RN $ 1
這是我得到的Cygwin GCC錯誤
temp [v 0] -> 0.460241 0.000000 0.050356
temp [v 1] -> 0.072079 0.153807 0.864573
temp [v 2] -> 0.683917 0.709301 0.080479
temp [v 3] -> 0.295755 0.264795 0.894696
address of ptemp @ 1629101750
[v 0] -> linked vertex is 7731159828445146316135105405324534341657178000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 578395405356271.125000 1310047834864691498231654014730274851713450000.000000
Segmentation fault (core dumped)
這裏是代碼
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NEWline printf("\n")
typedef struct position {
double x;
double y;
double z;
} position;
struct datalist {
position v;
struct datalist *pnext;
};
typedef struct datalist datalist;
void initializeList (datalist *head);
void addList_II (datalist *head , double data[3]);
void initializeList (datalist *head){
position pv= {0,0,0};
head = (datalist *) malloc (sizeof (head));
if (head == NULL){ printf("cannot allocate memory"); exit(1); }
head->v=pv;
head->pnext=NULL;
}
void addList_II (datalist *head , double data[3]) {
datalist *adddata;
adddata = (datalist *)malloc (sizeof (datalist));
if (adddata == NULL) { printf("cannot allocate memory for insertion data"); exit(1); }
adddata->v.x = data[0];
adddata->v.y = data[1];
adddata->v.z = data[2];
adddata->pnext = head->pnext;
head=adddata;
}
int main() {
datalist *ptemp;
datalist temp;
int i,c; //counters
datalist *head;
initializeList(head);
for (i = 0; i < 4; i++) {
double t[3];
srand (time (NULL)*i+234);
temp.v.x = ((double) rand() )/ RAND_MAX;
srand (time (NULL)*i*546);
temp.v.y = ((double) rand() )/ RAND_MAX;
srand (time (NULL)*i*567+345);
temp.v.z = ((double) rand() )/ RAND_MAX;
t[0] = temp.v.x; t[1] = temp.v.y; t[2] = temp.v.z;
printf ("temp [v %d] -> %F %F %F \n",i, temp.v.x, temp.v.y, temp.v.z);
addList_II (head, t);
}
c=0;
ptemp=head;
while (ptemp!=NULL) {
printf("[v %d] -> linked vertex is %F %F %F \n", c, ptemp->v.x,ptemp->v.y, ptemp->v.z);
ptemp=ptemp->pnext;
}
}
有一些指針sizeof()d代替對象的sizeof的地方。 – hmjd
是的,在你的初始化。確保你解決了這個問題,並做了sizeof(datalist) – 75inchpianist