(C编程)创建数组和分配空间(通过malloc)会影响另一个数组

时间:2012-09-15 19:26:52

标签: c malloc

编辑:我大大改变了我的代码,使其类似于原始代码的实际结构(我无法发布,因为我必须编写解释所有内容的页面和页面)。


我一直在努力解决这个问题。我有六个int数组,ID1ID2ID3,以及array1array2array3,其中名称具有相同的索引具有相同的长度(分别为len1len2len3。我的想法是我在for循环中重新创建它们,因为这些数组的长度在它内部发生变化。我这样做如下:

/* Before entering the loop, I define these three arrays, where 
   len1, len2 and len3 are all equal to 100. */

int i,S,len1,len2,len3;
len1=100;
len2=100;
len3=100;
int* ID1; 
int* ID2; 
int* ID3;
ID1=(int*) malloc((len1)*sizeof(int));
ID2=(int*) malloc((len2)*sizeof(int));
ID3=(int*) malloc((len3)*sizeof(int));
/* Then I fill the arrays with values from a loop which is not relevant 
   to my problem. Let's just fill them with a simple for loop: */
for(i=0;i<len1;i++){
    ID1[i]=i;
    ID2[i]=i;
    ID3[i]=i;
}
/* Now I enter a loop, in which I create 3 more arrays named array1, array2 
   and array3: */
for(S=98;S>=0;S--){
 printf("ID3[99]:%d (before)\n",ID3[99]); // 1st call to printf
 int* array1;
 int* array2;
 int* array3;
 array1=(int*) malloc((len1)*sizeof(int));
 array2=(int*) malloc((len2)*sizeof(int));
 array3=(int*) malloc((len3)*sizeof(int));
 printf("ID3[99]:%d (after)\n",ID3[99]);  // 2nd call to printf
 /* I do more stuff here. Here len1, len2 and len3 changes, so I have to 
    re-create the "ID" arrays and the ones named "array". The idea is to fill 
    the new "ID1", "ID2" and "ID3" arrays with the values of another set of 
    arrays that I filled with values from complex calculations named 
    "AnotherArray1", "AnotherArray2" and "AnotherArray3". 
    The lenghts are always > 100.*/
 free(ID1);
 free(ID2);
 free(ID3);
 free(array1);
 free(array2);
 free(array3);
 int* ID1;
 int* ID2;
 int* ID3;
 ID1=(int*) malloc((len1)*sizeof(int));
 ID2=(int*) malloc((len2)*sizeof(int));
 ID3=(int*) malloc((len3)*sizeof(int));
 for(i=0;i<len1;i++){
    ID1[i]=AnotherArray1[i];
 }
 for(i=0;i<len2;i++){
    ID2[i]=AnotherArray2[i];
 }
 for(i=0;i<len3;i++){
    ID3[i]=AnotherArray3[i];
 }
 /* Finally, I need to free the "AnotherArray" arrays, because in the loop 
    I need to create them again and do some complex calculations with the 
    "ID" arrays. */
 free(AnotherArray1);
 free(AnotherArray2);
 free(AnotherArray3); 
 printf("ID3[99]:%d (before, after starting the loop again)\n",ID3[99]); // 3rd call to printf
}

问题在于,当我这样做时,printf函数的第3次调用与第1次和第2次调用不同(即,当循环再次开始时,ID3的某些元素中的值突然突然出现变化!)。我真的不知道这里发生了什么......有什么建议吗?如果您需要更多详情,请告诉我。

2 个答案:

答案 0 :(得分:1)

问题是在循环之前array没有创建,它在循环之前被声明。在分配

之前,它仍然未初始化
array=(int*) malloc((len1)*sizeof(int));

在最后。同时,指针指向存储器中某些恰好可读的位置。然而,内存被分配给其他东西,并且有些东西在不断变化。这就是两个打印输出不同的原因。

通常,在第一次分配之前,不得取消引用指针;它是未定义的行为,可能会返回垃圾,或者可能导致程序崩溃。

答案 1 :(得分:1)

/ *(在循环开始之前创建数组)* /

printf(“array [0]:%d(before)”,array [0]);

printf(“array [0]:%d(after)”,array [0]);

int *数组;  array =(int *)malloc((len1)* sizeof(int));

/ *用一些值填充数组,循环再次开始* /

我会注意到你每次都为数组分配一块新的内存。由于它是不同的内存块,因此可能具有不同的(垃圾)值。我怀疑在再次进行mallocing之前 free(array)是个好主意。

那里有代码味道

len2=100;
len3=100;
int* ID1; 
int* ID2; 
int* ID3;
ID1=(int*) malloc((len1)*sizeof(int));
ID2=(int*) malloc((len2)*sizeof(int));
ID3=(int*) malloc((len3)*sizeof(int));

... 

int* ID1;
int* ID2;
int* ID3;
ID1=(int*) malloc((len1)*sizeof(int));
ID2=(int*) malloc((len2)*sizeof(int));
ID3=(int*) malloc((len3)*sizeof(int));

您第二次声明ID1,ID2和ID3。 这很可能会混淆这个问题。 它有效地是第二组变量。这可能是你问题的根源。

我会注意到原始分配永远不会被释放。