1

編集:元のコードの実際の構造に似るようにコードを大幅に変更しました(すべてが何であるかを説明するページやページを作成する必要があるため、投稿できません)。


私はこの問題に苦しんでいます。6つのint配列、、、、、、、およびがあります。ここでID1、同じインデックスを持つ名前の長さは同じです(それぞれ、、、)。これらの配列の長さが内部で変化するため、forループでそれらを再作成するという考え方です。私はこれを次のように行っています:ID2ID3array1array2array3len1len2len3

/* 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の値が突然変化します!)。ここで何が起こっているのか本当にわかりません...何かアドバイスはありますか?詳細が必要な場合はお知らせください。

4

2 に答える 2

1

問題は、ループの前に作成されarrayておらず、ループの前に宣言されていることです。割り当てまで初期化されないままです

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

最後に。その間、ポインタはメモリ内の読み取り可能な場所を指します。ただし、メモリは他の何かに割り当てられており、その何かは変化し続けます。そのため、2つのプリントアウトは異なります。

一般に、最初の割り当ての前にポインターを逆参照してはなりません。ジャンクを返したり、プログラムをクラッシュさせたりする可能性のある未定義の動作です。

于 2012-09-15T19:40:54.767 に答える
1

/ *(ループが開始する前に配列が作成されます)* /

printf( "array [0]:%d(before)"、array [0]);

printf( "array [0]:%d(after)"、array [0]);

int*配列; array =(int *)malloc((len1)* sizeof(int));

/ *配列にいくつかの値を入力すると、ループが再開されます* /

毎回、アレイに新しいメモリチャンクを割り当てていることに注意してください。これはメモリの異なるチャンクであるため、異なる(ガベージ)値を持つ可能性があります。再びmallocする前に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をもう一度宣言します。それは問題を混乱させる可能性があります。これは事実上、変数の2番目のセットです。それがあなたの問題の原因かもしれません。

元の割り当てが解放されることはありません。

于 2012-09-15T20:32:56.480 に答える