-5

こんにちは、コードがエラーを生成する理由を教えてください。

#include<stdio.h>
int main(){
    char ***x;
    char **q = *x;
    char **(*c) = x;
    char ***d = &q;
    char ***p = "asdasd";

    x=p;

    printf("d:%s\n",d);
    printf("q:%s\n",q);
    printf("x:%s\n",x);


return 0;

}

出力: 1 セグメンテーション違反

返信ありがとうございます。x を初期化すると、まだセグメンテーション違反が発生します。

printf("q:%s\n",q);

出力とコードを以下に示します。1231123124 ではなく d:1231 である理由と、x=p がすべて (x、q、d) ではなく x の値のみを変更する理由を教えてください。

int main(){
    char ***x = "1231123124";
    char **q = *x;
    char **(*c) = x;
    char ***d = &q;
    char ***p = "asdasd";

    x=p;

    printf("p:%s\n",p);
    printf("d:%s\n",d);
//  printf("q:%s\n",q);
    printf("x:%s\n",x);
    printf("c:%s\n",c);

    return 0;
}

出力: p:asdasd

日:1231

x:asdasd

c:1231123124

4

2 に答える 2

2
char **q = *x;

ここでは、初期化されていないポインターを逆参照しています。

これは未定義の動作です。この場合、通常は segfault が発生します (実際には、コンパイラがローカル変数を初期化する場合、コードはランダムなメモリ位置、または NULL を逆参照しようとします (これはデバッグ/最適化されていないビルドで一般的です))。

于 2013-07-12T00:04:28.973 に答える
1

これらは型エラーです。

printf("d:%s\n",d); // d is char***, not char*
printf("q:%s\n",q); // q is char**, not char*
printf("x:%s\n",x); // x is char***, not char*

%s指定子は、char *引数、またはおそらくvoid *,などを想定していますが、 やは想定してconst char *いませchar **char ***

于 2013-07-12T00:04:58.853 に答える