2011-04-02 68 views
0

您好我正在用C寫一個程序,但是在運行我的程序時出現分段錯誤。將值分配給C中的動態二維數組時分段錯誤

我使用gcc進行編譯,編譯時沒有警告或錯誤。

我試過使用gdb來跟蹤segfault的原點,它指示我將數據值分配給我的二維數組的行: array [row] [column] = datavalue;

當我運行我的程序存儲3個數據值,然後seg故障。它應該將數據存儲在424行,117列的數據上,但是隻有在存儲了3個數據值後,它才能保持數據段的錯誤。

我的代碼如下(有一些細節省略了):

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

void allmem(float** fpdata,...);   // allocate memory header 
void stored(float** fpdata,...);   // store data header 
void countnumber(int* num1, int*num2,...); // count header 

int main() // main() function 
{ 
int numberofrows = 424; // number of rows 
float** fpdata;   // two dimensional array fpdata of floats 

allmem(fpdata,...);  // call allocate memory function 
stored(fpdata,...);  // call function to store data 
... 
return 0; 
} // main() 

// --------------stored() function--------------- 
void stored(float** fpreal,...) { 

FILE *fp;     // file pointer 
float datavalue;   // variable to hold data values read 
int row; 
int column; 

fp = fopen("c:/file.txt","r"); 

for(column = 0; column < 117; column++) { 
    for(row = 0; row < 424; row++) { 
    fscanf(fp, "%f,", &datavalue); 
    fpdata[row][column] = datavalue; 
    } // for 
} // for 
fclose(fp); 
} // stored() 

// ----------allmem() function---------------- 
// function to allocate memory for two dimensional arrays 
// I have hard coded the values of the array sizes in, but 
// in my actual program they are calculated at run time based 
// on the size of some input files and this is done in the 
// countnumber() function 

void allmem(float** fpdata,...) { 
int i = 0; 
fpdata = (float**) malloc((424)*sizeof(float*)); 
fpdata2 = (float**) malloc((424)*sizeof(float*)); 
... 
for (i = 0; i<424; i++) { 
    fpdata[i] = (float*) malloc((117)*sizeof(float)); 
    fpdata2[i] = (float*) malloc((117)*sizeof(float)); 
} // for 

} // allmem() 
+0

您是否正在檢查以確保您所有對'malloc'的調用都成功返回? – bta 2011-04-02 01:17:03

+0

你說得對,我很抱歉。我刪除了我的答案。 – karlphillip 2011-04-02 01:28:37

+0

是的,我檢查了沒有空指針返回,我沒有用完內存,我想我只是以某種方式寫入分配的內存位置,但我不知道這是如何發生的。 – Veridian 2011-04-02 01:32:12

回答

6

fpdata由值而不是通過指針或通過引用傳遞。這意味着,當函數從allmem返回時,fpdata仍然指向它與之前所做的相同的事情,並且分配的內存會丟失。

你要打電話allmem(&fpdata,...);

和使用void allmem(float*** fpdata,...)

然後一個函數簽名,在allmem,設置*fpdata = (float**)...

,當然,(*fpdata)[i] = (float*) malloc...內 '的'循環。

編輯:

我希望你會爲fpdata2做同樣的事情。但你不應該改變任何東西stored()(雖然它看起來像你通過fpreal但分配值爲fpdata這可能只是一個簡化的代碼錯誤?)。傳遞給stored的指針應該是有效的。你不會試圖改變stored中的指針,只是它指向的內存中的值。

+0

嗨,謝謝JCooper,但是我在添加推薦內容後仍然遇到分段錯誤,同樣的事情發生在只有幾個數據位置被寫入到seg錯誤之前。也許你可以更清楚地瞭解我需要做的所有變化,只是這樣我才能確認我做了所有必要的更改。謝謝 – Veridian 2011-04-02 01:30:37

+0

嗨JCooper,我想我只需要(* fpreal)[row] [columns] = datavalue來寫入我的數組。我以爲我宣佈數組爲一個雙指針,所以真的我只是有一堆雙指針,所以我應該能夠傳遞fpdata,因爲它已經是一個指針了? – Veridian 2011-04-02 01:38:41

+0

你已經聲明瞭一個叫做'fpdata'的雙指針。它最初指向垃圾。你將垃圾的_value_傳遞給'allmem'。 allmem創建了一個新變量來保存垃圾。然後,您將該新變量中的值設置爲某個內存的指針。當函數返回時,新創建的變量將從堆棧中拋出,並且所有分配的內存都將丟失。 – JCooper 2011-04-02 01:44:39