1

ポインターの配列の末尾にアドレスを追加する関数を作成する必要があります。これが私がやったことです。私が正しかったかどうかを知りたいのですが、そうでない場合は修正してください。

#include <stdio.h>
#include <stdlib.h>
#define MAX 3

void add( int *array[MAX], int *addr)
{
    array = realloc(array, 1*sizeof(int));
    array[MAX+1] = addr;
}

int main()
{
    int *addr = 4;
    int *array[MAX] = {"1","2","3"};
    add(array, addr);
    int i;
    for(i = 0; i<4;i++)
        printf("%d ", array[i]);

    return 0;
}
4

1 に答える 1

1

realloc のマニュアルから:

realloc() 関数は、ptr が指すメモリー・ブロックのサイズを size バイトに変更します。コンテンツは、領域の開始から古いサイズと新しいサイズの最小値までの範囲で変更されません。新しいサイズが古いサイズより大きい場合、追加されたメモリは初期化されません。ptr が NULL の場合、size のすべての値について、呼び出しは malloc(size) と同等です。size がゼロに等しく、ptr が NULL でない場合、呼び出しは free(ptr) と同等です。ptr が NULL でない限り、malloc()、calloc()、または realloc() への以前の呼び出しによって返されたに違いありません。指している領域が移動された場合、free(ptr) が実行されます。

説明を読むには長すぎる場合。

まず第一に、ローカル宣言の後ではなく、メモリを割り当てた後(たとえばmallocを使用)にreallocを使用する必要があります

次に、int ( int * ) へのポインターを int であるかのように扱っています。警告としても表示されます

例:

int *addr = 4; 
int *array[MAX] = {"1","2","3"}; 
array = realloc(array, 1*sizeof(int));     // here you're using sizeof( int )

別の問題が配列の範囲外に達しています

 array[MAX+1] = addr;

3 つのスペースを持つ配列の場合 - 配列 [0]、配列 [1]、および配列 [2] があります。

この行では、サイズ 4 の配列 (と思われる) の配列 [ 4 ] に到達しようとしています --> 範囲外です

これに対する私の推奨コードは次のとおりです。

コード編集

#include <stdio.h>
#include <stdlib.h>
#define MAX 3

void add( int **array[ MAX ], int *addr )
{
    *array = realloc( *array, ( MAX + 1 ) * sizeof( int* ) );
    (*array)[ MAX ] = addr;
}

int main()
{
    int i;
    int *addr;
    int **array;

    addr = &i;
    array = malloc( MAX * sizeof ( int* ) );
    for ( i = 1; i <= MAX; i++ ) {
        array[ i - 1 ] = addr + 4 * i;
    }

    add( &array, addr );

    for ( i = 0; i < MAX + 1; i++ ) {
        printf( "%p ", array[ i ] );
    }

    return 0;
}
于 2015-08-30T08:44:56.410 に答える