2

配列を次のように持つ:

type **a;

a[0][data_0]
a[1][data_1]
a[2][data_2]
a[n][data_n]

このような配列を次のように拡張する場合:

  1. realloc()に。a_sizeof(type*) * (n + 1)
  2. malloc() (*a[n])可変サイズのdata_n場所に合わせます。data_n

realloc()of に問題がある可能性はありaますか?

a[2]が常に を指しているように、がメモリ内で移動したdata_2場合でも、aそのリンクが失われる可能性はありますか?

私が理解しているように、メモリには次のようなものがあります。

         Address               Address
a[0] => 0x###131, (*a[0]) => 0x####784
a[1] => 0x###135, (*a[1]) => 0x####793
a[2] => 0x###139, (*a[2]) => 0x####814

realloc()私は次のようなものになってしまうことができた後:

         Address               Address
a[0] => 0x###216, (*a[0]) => 0x####784
a[1] => 0x###21a, (*a[1]) => 0x####793
a[2] => 0x###21e, (*a[2]) => 0x####814
a[n] => 0x###zzz, (*a[n]) => 0x####yyy

これは正しいです?data_n セグメントはそのまま残されていますか、それとも移動される可能性がありますか?

4

3 に答える 3

2

より大きなサイズに再割り当てする場合、元のバイトは変更されません。

例:

char **a = malloc(n*sizeof(char *));
for (i=0; i!=n; ++i) {
  a[i] = malloc(m);
}

a = realloc(a,(n+1)*sizeof(char *));
// a[0]...a[n-1] are still the same
a[n] = malloc(m);
于 2012-10-09T13:29:22.500 に答える
2

これは正しいです?data_n セグメントはそのまま残されていますか、それとも移動される可能性がありますか?

はい、の値はa[i]新しい0 <= i < n場所にコピーされるため、ポインターは同じ場所を指しdata_i、それらは移動されません。

realloc()of に問題がある可能性はありaますか?

もちろん、 areallocは常に失敗して を返す可能性がNULLあるため、決して実行しないでください。

a = realloc(a, new_size);

ただし、一時変数を使用して の戻り値を格納しますrealloc

于 2012-10-09T13:29:44.260 に答える
1

ええ、古い値のアドレスは realloc() の後でも同じままです

このプログラムの出力で次のことがわかります。

shubhanshm@BANLSHUBHANSH /cygdrive/f/My Codes/Practice/C
$ ./a.exe
Original Array details before using realloc():
Printing array with size 4x4
1       0       0       19
2       4       0       19
3       6       9       27
4       8       12      16
Printing array addresses with size 4x4
a[0][0]=1       ->0x20010260
a[0][1]=0       ->0x20010264
a[0][2]=0       ->0x20010268
a[0][3]=19      ->0x2001026c

a[1][0]=2       ->0x20010270
a[1][1]=4       ->0x20010274
a[1][2]=0       ->0x20010278
a[1][3]=19      ->0x2001027c

a[2][0]=3       ->0x20010280
a[2][1]=6       ->0x20010284
a[2][2]=9       ->0x20010288
a[2][3]=27      ->0x2001028c

a[3][0]=4       ->0x20010290
a[3][1]=8       ->0x20010294
a[3][2]=12      ->0x20010298
a[3][3]=16      ->0x2001029c

Array details after using realloc():
Printing array with size 5x4
1       0       0       19
2       4       0       19
3       6       9       27
4       8       12      16
5       10      15      20
Printing array addresses with size 5x4
a[0][0]=1       ->0x20010260
a[0][1]=0       ->0x20010264
a[0][2]=0       ->0x20010268
a[0][3]=19      ->0x2001026c

a[1][0]=2       ->0x20010270
a[1][1]=4       ->0x20010274
a[1][2]=0       ->0x20010278
a[1][3]=19      ->0x2001027c

a[2][0]=3       ->0x20010280
a[2][1]=6       ->0x20010284
a[2][2]=9       ->0x20010288
a[2][3]=27      ->0x2001028c

a[3][0]=4       ->0x20010290
a[3][1]=8       ->0x20010294
a[3][2]=12      ->0x20010298
a[3][3]=16      ->0x2001029c

a[4][0]=5       ->0x20048300
a[4][1]=10      ->0x20048304
a[4][2]=15      ->0x20048308
a[4][3]=20      ->0x2004830c

上記の出力のソース コードは次のとおりです。

#include<stdio.h>
#include<stdlib.h>

#define mul(x, y) (((x)+1)*((y)+1))

void printArr(int **a, int r, int c){
    int i, j;
    printf("Printing array with size %dx%d\n", r, c );
    for(i = 0; i < r; i++){
        for(j = 0; j < c; j++){
            printf("%d\t", a[i][j]);
        }
        printf("\n");
    }
}

void printArrAddress(int **a, int r, int c){
    int i, j;
    printf("Printing array addresses with size %dx%d\n", r, c );
    for(i = 0; i < r; i++){
        for(j = 0; j < c; j++){
            printf("a[%d][%d]=%d\t->%p\n", i, j, a[i][j], &a[i][j]);
        }
        printf("\n");
    }
}

int main(){
    int **a;
    int n = 4;
    a = (int**)malloc(sizeof(int*)*n);
    int i, j;
    for(i = 0; i< n; i++){
        a[i] = (int*)malloc(sizeof(int)*(i+1));
        for(j = 0; j < i+1; j++ )a[i][j] = mul(i, j);
    }
    printf("Original Array details before using realloc():\n");
    printArr(a, n, n);
    printArrAddress(a, n, n);

    a = (int**)realloc(a, sizeof(int*)*(n+1));
    a[n] = (int*)malloc(sizeof(int)*n);
    for( i = 0; i< n; i++){
        a[n][i] = mul(n, i);
    }
    printf("Array details after using realloc():\n");
    printArr(a, n+1, n);
    printArrAddress(a, n+1, n);
    return 0;
}

これで問題が解決することを願っています。

于 2012-10-09T15:28:39.683 に答える