0

こんにちは私はポインタと配列を理解しようとしています。YouTubeのビデオを見て、自分で再現しようとしているこの例を見つけました。以下はコードです。

#include <stdio.h>
#include <math.h>
main()
{
    int arr[][2]={{11,12},{21,22},{31,32},{41,42},{51,52}};
    int i,j;
    arr[5][1]=61;
    arr[5][0]=62;
    arr[6][1]=71;
    arr[6][0]=72;
    arr[7][1]=81;
    arr[7][0]=82;
    for(i=0;i<=7;i++)
    {
        for(j=0;j<=1;j++)
        {
            printf("%d  %d  %u  %u  %d  %d  %d  \n",i,j,arr[i],arr[i]+j,arr[i][j],*(*(arr+i)+j),*(arr[i]+j));
        }
    }
}

私がコードを実行すると、それは私に与えます

0 0 3216856768 3216856768 11 11 11  
0 1 3216856768 3216856772 12 12 12  
1 0 3216856776 3216856776 21 21 21  
1 1 3216856776 3216856780 22 22 22  
2 0 3216856784 3216856784 31 31 31  
2 1 3216856784 3216856788 32 32 32  
3 0 3216856792 3216856792 41 41 41  
3 1 3216856792 3216856796 42 42 42  
4 0 3216856800 3216856800 51 51 51  
4 1 3216856800 3216856804 52 52 52  
5 0 3216856808 3216856808 0 0 0   
5 1 3216856808 3216856812 5 5 5   
6 0 3216856816 3216856816 72 72 72  
6 1 3216856816 3216856820 71 71 71  
7 0 3216856824 3216856824 82 82 82  
7 1 3216856824 3216856828 81 81 81  

arr[5][0]とarr[5][1]に指定された値が割り当てられていないのはなぜですか?5と0はどこから来ていますか?

4

1 に答える 1

3

魔法ではありません (スクリプト言語でもありません)。5 つの要素を持つ配列を作成すると、5 つの要素を持つことになります。何をしても、自動的に拡張されません。その後、配列の範囲外にアクセスすると、未定義の動作が発生します。このコードはクラッシュする可能性さえあります。

代わりにすべきことは、十分な大きさの配列を宣言することです:

int arr[8][2] = { { 11, 12 }, { 21, 22 }, { 31, 32 }, { 41, 42 }, { 51, 52 } };

その後、それらに正しく割り当てることができます。malloc()または、標準のメモリ管理関数を使用して動的に拡張する配列を使用し、次のようにしrealloc()ます。

int **arr = malloc(sizeof(*arr) * 5);
int i;
for (i = 0; i < 5; i++) {
    arr[i] = malloc(sizeof(**arr));
}

そして一つずつ埋めていく

arr[0][0] = 11;
arr[0][1] = 12;
// etc.

次に、必要に応じて展開します。

arr = realloc(arr, sizeof(*arr) * 8);
for (i = 5; i < 8; i++) {
    arr[i] = malloc(sizeof(**arr));
}

その後も安心してご利用いただけますarr[5]...arr[7]free()ただし、この後者の場合、使用後に解放する必要があるすべてのポインターを忘れないでください。

于 2013-01-11T19:31:40.127 に答える