0

配列のすべての内容を逆方向にコピーしないように、配列のポインターを調整しています。問題は、ある時点でデータを解放したいということです。ポインタを元のアドレスに戻さない限り、セグメンテーション違反が発生します。これを回避する方法はありますか?シフトが関数内で実行される場合、呼び出し元の関数はシフトの大きさを認識しない可能性があるためです。

例:

int i;
float * y = malloc(10*sizeof(float));

for(i=0;i<10;i++) y[i] = (float)i;

y += 2; 

for(i=0;i<8;i++) printf("%d\n",y[i]);

free(y); // this will generate a segmentation fault
y -= 2; free(y); // this is OK, but I would like to avoid it

ここに期待しすぎですか?

4

4 に答える 4

4

これは不可能です。に渡されるポインタfree()は、動的割り当て関数の 1 つから返される必要があります。free()参照ページから:

malloc()、calloc()、または realloc() によって以前に割り当てられたスペースの割り当てを解除します。ptr が null ポインターの場合、関数は何もしません。

ptr が、malloc()、calloc()、または realloc() によって以前に返されたポインターと一致しない場合、動作は未定義です。また、ptr によって参照されるメモリ領域がすでに割り当て解除されている場合、つまり、free() または realloc() が引数として ptr で既に呼び出されており、malloc()、calloc() またはへの呼び出しがない場合、動作は未定義です。 realloc() は、その後 ptr に等しいポインターになりました。


シフトが関数内で実行される場合、呼び出し元の関数はシフトの大きさを認識しない可能性があるためです。

ポインターが値で渡される場合は問題ありません。ポインターへの変更は呼び出し元には表示されません。

void f(char* a_ptr) { a_ptr++; }

char* p = malloc(10);
f(p);
free(p); /* Valid as no change was made to 'p'. */
于 2013-04-26T13:19:04.117 に答える
1

別の変数を使用できます。

int i;
float * y = malloc(10*sizeof(float));

for(i=0;i<10;i++) y[i] = (float)i;

float *y2 = y+2;

for(i=0;i<8;i++) printf("%d\n",y2[i]);

free(y);
于 2013-04-26T13:18:37.993 に答える
1
int i;
float *y = malloc(10*sizeof(float));

for(i=0;i<10;i++) y[i] = (float)i;

//y += 2; 
float *y2 = y + 2;
for(i=0;i<8;i++) printf("%f\n",y2[i]);

y=realloc(y, 2*sizeof(float));//do free y[2]..y[9]

free(y);//finally
于 2013-04-26T13:27:42.280 に答える
1

float * z = ymalloc の後に行うだけfree(z)で、最後に、

于 2013-04-26T13:19:11.163 に答える