2

質問があります...コードの次の部分があるとしましょう:

int *a,*a1,*a2;
for (i=1; i<=2; i++) {
    a=malloc(sizeof(int));
    if (i==1) a1=a;
    else if (i==2) a2=a;
}
*a1=5;
*a2=4;

だから私の質問は、printfを使用してa1とa2を出力すると、変数a1の値は5になり、a2の値は4になりますか?したがって、malloc を使用してメモリを割り当て、そのメモリ空間内のポイントを割り当て、再度 malloc を使用してメモリを割り当てると、メモリの別の部分へのポイントが存在しますが、メモリの最初の部分はまだ存在しますか? または、もう一度 malloc を使用すると、メモリの最初の部分が消去され、メモリの新しい部分が書き込まれます

4

4 に答える 4

10

Each call to malloc returns a pointer to different memory, until you call free to release that memory.

于 2013-01-09T14:07:16.507 に答える
3

printf を使用して a1 と a2 を出力すると、変数 a1 の値は 5 になり、a2 の値は 4 になりますか?

ええと...いいえ。

a1(タイプint *、つまり整数へのポインター) には、への最初の呼び出しの結果のアドレスmalloc()が含まれます。

a2(およびa) もポインター型であり、への2 番目の呼び出しの結果のアドレスが含まれます。malloc()

アドレスa1、値 5 を割り当てた整数を指します。

(および)内のアドレスは、値 4 を割り当てた整数を指します。a2a

これらの整数は両方ともfree()、アドレスを呼び出して解放するまで割り当てられたままになります。注意: eg を呼び出した後free( a2 )、整数は割り当てられなくなります。free()同じアドレスで再度呼び出すと (たとえば、 を介してfree( a )、またはfree( a2 )2 回目の呼び出しによって)、未定義の動作が発生します (つまり、運が良ければ、プログラムがクラッシュします)。

ポインタはアドレス値です。これがあなたの混乱の原因のようです。それは、それが指すものと同一ではありません。

于 2013-01-09T14:10:07.243 に答える
0

I believe the answer to your question is yes. Malloc'ing will give you a memory location with (at least) the specified size (if available). It does not free any memory, only gives you more (use free() to free malloc'ed memory).

The fact that you are using some temporary variable a has no significance. At the end of this loop a == a2 != a1

于 2013-01-09T14:07:32.513 に答える
0

printf を使用して a1 と a2 を出力すると、変数 a1 の値は 5 になり、a2 の値は 4 になりますか?

はい。それで合っています。ただし、尋ねるよりも試して見る方が簡単なので、少し奇妙な質問です。

したがって、malloc を使用してメモリを割り当て、そのメモリ空間内のポイントを割り当て、再度 malloc を使用してメモリを割り当てると、メモリの別の部分へのポイントが存在しますが、メモリの最初の部分はまだ存在しますか?

それは正しいです。malloc()を使用して解放するまで「存在する」メモリを割り当てるfree()realloc()、データを別のメモリに移動して古いメモリの場所を解放する可能性のある を実行します。それに関するドキュメントを読むことをお勧めします。少なくともマニュアルページ

また、コードにエラーがあります。比較の代わりに割り当てを使用し、変数iが定義されていません。を含む修正版を次に示しますprintf()

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

int main()
{
    int *a,*a1,*a2;
    int i;

    for (i=1; i<=2; i++) {
        a = malloc(sizeof(int));
        if (i==1)
            a1 = a;
        else if (i==2)
            a2 = a;
    }
    *a1=5;
    *a2=4;

    printf("a1=%d, a2=%d\n", *a1, *a2);

    free(a1);
    free(a2);

    return EXIT_SUCCESS;
}

それが役に立てば幸い。幸運を!

于 2013-01-09T14:12:18.233 に答える