1

私は次のことを試しました:

#include <stdio.h>

int main(void) {
     char multi[3][10];
     multi[0] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
     multi[1] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};
     multi[2] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'};
     printf("&multi[2][2]: %d \n", (int) &multi[2][2]);
     printf("(*multi + 2) + 2: %d \n" , (int) (*multi + 2) + 2);
}

そして、この出力が得られました:

dominik@luna:~$ gcc tmp.c 
tmp.c: In function ‘main’:
tmp.c:5: error: expected expression before ‘{’ token
tmp.c:6: error: expected expression before ‘{’ token
tmp.c:7: error: expected expression before ‘{’ token

私はすでにいくつかの調査を行っており、ウラジミールが「配列を宣言するのと同じ行で配列を初期化する必要があります」と述べているこのスレッドを見つけました。これはまだ私を混乱させます.スパゲッティコードを書くべきではないのと同じように、それを行うべきではないのですか、それともできないということですか.

それとも、私が完全に間違ったことをしている可能性がありますか?

4

1 に答える 1

2

この方法で配列を初期化することはできますが、割り当てることはできません。

#include <stdio.h>

int main(void) {
     char multi[3][10] = {
         {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'},
         {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'},
         {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'}
     }
     printf("&multi[2][2]: %d \n", (int) &multi[2][2]);
     printf("(*multi + 2) + 2: %d \n" , (int) (*multi + 2) + 2);
}

また、少なくとも 64 ビット システムでは、出力するスタック アドレスが切り捨てられることに注意してください。スタックアドレスを出力しようとしていますか? これを行う:

printf("&multi[2][2]: %p\n", (char *) &multi[2][2]);
printf("(*multi + 2) + 2: %p\n" , (char *) (*multi + 2) + 2);

私のシステムでは、この変更により、 の範囲外である 2 47のすぐ下( の上0x7fff00000000) にある正しいアドレスが出力されintます。

于 2013-01-05T10:46:08.280 に答える