EDIT:我大幅更改了我的代码,使其类似于原始代码的实际结构(我无法发布,因为我必须编写一页又一页来解释一切)。
我一直在为这个问题而苦苦挣扎。我有六个 int 数组,ID1
、ID2
和 ID3
以及 array1
、array2
和 array3
,其中具有相同索引的名称具有相同的长度(分别为len1
、len2
和 len3
)。这个想法是我在 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 值突然改变!我真的不知道这是怎么回事...有什么建议吗?如果您需要更多详细信息,请告诉我。
(数组在循环开始之前创建) */
printf("array[0]: %d (before)",array[0]);
printf("array[0]: %d (after)",array[0]);
整数* 数组; array=(int*) malloc((len1)*sizeof(int));
/* 用一些值填充数组,循环再次开始 */
我要指出的是,您每次都会为数组分配一个新的内存块。 由于它是不同的内存块,因此它可能具有不同的(垃圾)值。 我怀疑在再次错误定位之前释放(数组)是个好主意。
那里有代码气味
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。这可能会混淆问题。它实际上是第二组变量。 这可能是您问题的根源。
我要指出的是,原始分配永远不会被释放。
问题是array
不是在循环之前创建的,而是在循环之前声明的。在赋值之前,它保持未初始化状态
array=(int*) malloc((len1)*sizeof(int));
在最后。同时,指针指向内存中的某个位置,该位置恰好是可读的。但是,内存被分配给其他东西,并且某些东西一直在变化。这就是为什么两个打印输出不同。
通常,在第一次赋值之前,您不能取消引用指针;未定义的行为可能会返回垃圾或可能使程序崩溃。