2016-03-10 34 views
-1

我的malloc調用有問題。我有以下代碼:Malloc更改C中的值

int** parseEntireFile(int *sizeArray) 
{ 
FILE * fp; 
char buffer[5000]; 
int size = 0; 
int a,b,c; 
int res; 
int **someArray; 

fp = fopen("input.txt","r"); 

while (fgets(buffer,sizeof(buffer),fp)!= NULL) 
{ 
    size++; 
} 

fclose(fp); 

fp = fopen("input.txt","r"); 
someArray = malloc(sizeof(int) * size); 
size = 0; 

while(fgets(buffer, sizeof(buffer), fp) != NULL) { 
    res = sscanf(buffer, "%d%d%d", &a, &b, &c); 
    if (res == 3) 
    { 
     someArray[size] = malloc(sizeof(int*) * 500); 
     someArray[size][0] = a; 
     someArray[size][1] = b; 
     someArray[size][2] = c; 


    }else if (res == 2) { 
     someArray[size] = malloc(sizeof(int*) * 500); 
     someArray[size][0] = a; 
     someArray[size][1] = b; 
     someArray[size][2] = 0; 

    } else if (res == 1) { 
     printf ("1 value %d\n", a); 
    } else 
    { 
     printf ("0 values\n"); 
    } 
    size++; 

} 

*sizeArray = size; 
return someArray; 
} 

所有這一切工作正常,但在我的主,我宣佈結構指針數組和malloc的那樣:

struct allData **certainData; 
certainData = malloc(sizeof(struct allData) * size); 

當我這段代碼添加到我的節目休息的程序打印的是錯誤的值,但是當我把malloc拿出來的時候就好了。有人知道問題出在哪裏嗎?

+4

'someArray'是一個int *數組,指向int的指針。因此,你應該分配'size * sizeof(int *)'; 'size * sizeof(int)'可能太小了。相反,您對'someArray [i]'的分配應基於sizeof(int)'。 (一個好的模式是做類似'p = malloc(n * sizeof(* p))'的東西,其中正確的類型是從'p'指向的東西派生的。) –

回答

-1

someArray = malloc(sizeof(int) * size); 不應該編譯。 malloc應該返回void*,所以你應該施放它。

此外,像評論說,這應該被分配一個指針數組。

如果指針大於整數,就像在典型的64位版本中一樣,那麼您會超出someArray並寫入堆棧中的任何其他內容。所以,你應該預料錯誤的價值觀,certainData搗毀等

+2

問題是關於C,其中隱式轉換'void *'是合法的。只需在C++中進行強制轉換。 –

+0

「*所以你應該施放它。*」不,因爲在C中不需要也不推薦施放'void *'。 – alk

1
someArray = malloc(sizeof(int) * size); 

應該

someArray = malloc(sizeof(int*) * size); 

可能是你的平臺具有的sizeof(INT *)!=的sizeof(int)的。

+1

在它下面它應該'sizeof(int)'再次;) –

+0

@Joshua我剛剛測試了兩個,它不是或者是導致問題。它低於我的malloc結構是它導致我的程序打印值不應該是 – FreeStyle4

+0

有沒有地方你malloc一個結構。 – Joshua