2016-03-10 32 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