2

ポインターを介して文字列の配列にアクセスしようとしています。メモリが割り当てられている場合は正常に動作しているようですが、ポインターを再度反復しようとすると、どういうわけか値が失われます。ただし、指定されたアドレスは正しいです。

char **rows = (char **) malloc(sizeof(char) * 8);
int i;

for (i = 0; i < 5; i++) { //first time
    *(rows + i) = malloc(sizeof(char) * 8);
    sprintf(*(rows + i), "0x10%d", i);
    printf("---%s@0x%x", *(rows + i), (rows + i));

}

for (i = 0; i < 5; i++) { //second time
    printf("++++%s@0x%x", *(rows + i), (rows + i));
}

出力形式 : 値@アドレス

上記 (最初のループ) では、次の出力が生成されます。

---0x100@0x1007e0
---0x101@0x1007e8
---0x102@0x1007f0
---0x103@0x1007f8
---0x104@0x100800

値と対応するアドレスに関して正しいのはどれですか。しかし、どういうわけか、値を再度使用しようとすると値が失われます。以下は、2 番目のループからの出力です。

++++@0x1007e0
++++0@0x1007e8
++++0x102@0x1007f0
++++0x103@0x1007f8
++++0x104@0x100800

5 つのノードすべてでアドレスが正しいことは明らかですが、開始ノードの値が欠落しています。

質問:

アドレス 0x1007e0 と 0x1007e8 の値が有効なアドレスで欠落しているのはなぜですか?

ありがとう、

4

1 に答える 1

2

これは、コードがポインターに十分なスペースを割り当てていないことに関係していると思います。8文字ではなく8つのポインターを割り当てているため、この行

char **rows = (char **) malloc(sizeof(char) * 8);

する必要があります

char **rows = malloc(sizeof(char*) * 8);

この変更を行うと、問題が修正されます ( demo on ideone )。

于 2013-06-17T10:24:56.033 に答える