0

次の出力について教えてください。

int main() 
{

  char ***x = "jjhljlhjlhjl";  

  char ***q = "asddfwerwerw";

  **q = **x;  

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

}

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

4

2 に答える 2

3

これはあなたが持っているべきものです:

#include <stdio.h>

int main(void) {

  char *x = "jjhljlhjlhjl";

  char *q = "asddfwerwerw";

  q = x;

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

  return 0;

}

文字列を初期化したい場合は使用char *x しないでください***x。これは、charへのポインターへのポインターへのポインターを意味します。それが役立つことを願っています。

于 2013-09-25T01:52:52.257 に答える
2

「セグメンテーション違反」は出力ではなく、プログラムがクラッシュしたことを示しています。

文字列リテラルはchar*であって ではないため、これは当然のことchar***です。このようなポインターを二重参照解除しようとすると、未定義の動作になります。これは、文字列リテラルの内容を へのポインターとして再解釈するためcharです。これがクラッシュの原因です。

次のようにプログラムを変更して、合法的にすることができます。

int main() {
    char *x = "jjhljlhjlhjl";
    char tmp[] = "asddfwerwerw";
    char *q = tmp;

    *q = *x;
    // This will produce an output that should be easy to explain:
    printf("x:%s\n",x);
    printf("q:%s\n",q);
}
于 2013-09-25T01:50:10.773 に答える