2012-08-02 137 views
1

我有以下代碼段錯誤,我完全不知道爲什麼。任何幫助將非常感激。指針/結構問題C

段錯誤發生在我這樣做(檢查是否所有東西都被正確初始化了)。沒有打印任何內容,因此它在第一行上出現段錯誤。不幸的是,我不能使用valgrind,因爲這段代碼位於我無法訪問的沙箱內,所以無法檢查那裏的問題。

for (i = 0 ; i<nb_read ; i++) { 

fprintf(stdout, "Read Lock i %d %p \n ",i, nap->read_buffer[i]->sem_handle); 
fprintf(stdout, "Write Lock i %d %p \n ",i, nap->write_buffer[i]->sem_handle); 
fprintf(stdout, "Read Buffer i %d %p \n ",i, nap->read_buffer[i]->buffer); 
fprintf(stdout, "Write Buffer i %d %p \n ",i, nap->write_buffer[i]->buffer); 

} 

其中SharedStruct是一個char *緩衝部件sem_handle一個結構和INT

SharedStruct** create_buffer(int nb, int size) { 
SharedStruct** result = malloc(nb * sizeof(SharedStruct*)); 
int i = 0 ; 
for (i = 0 ; i<nb ; i++) { 
     SharedStruct* res= malloc(nb *sizeof(SharedStruct)); 
     res->buffer = malloc(size * sizeof(char)); 
     int lock = initialise_protection(); 
     fprintf(stdout, "\n Semaphore initialised to %d \n ", lock); 
     res->sem_handle = lock ; 
    } 
    return result ; 
} 
+2

爲什麼不在自己的機器上編譯它,並在那裏用'valgrind'測試它? – 2012-08-02 18:49:49

+0

另外,什麼是「午睡」,它在哪裏初始化?如果'nap-> read_buffer'是一個'char'數組,那麼當然這是行不通的。如果你做了'''' - > sem_handle',你會期望結果如何? – 2012-08-02 18:53:11

+0

爲什麼這樣:SharedStruct * res = malloc(nb * sizeof(SharedStruct)); ? 我會說:result [i] = malloc(sizeof(SharedStruct)); + Gordon Bailey說的 – Razvan 2012-08-02 18:54:12

回答

6

我沒有看到你初始化包含在結果的指針。你剛剛爲他們分配了空間,似乎你忘了在你的循環中做結果[i] = res。

+1

+1好的。 :) – netcoder 2012-08-02 19:05:32

+0

解決了它。神。愚蠢:D – user1018513 2012-08-02 20:35:54

1

首先。您應該正確縮進代碼,否則您無法讀取自己的代碼。

接下來,您將result初始化爲nb條目的數組,並且根本沒有初始化它。

接下來,您將指向nb次的指針分配給(SharedStruct *),並且對於每個這樣的結構,您分配一個緩衝區,您不會保留在任何地方,因此您以後不能釋放它。