次の出力について教えてください。
int main()
{
char ***x = "jjhljlhjlhjl";
char ***q = "asddfwerwerw";
**q = **x;
printf("x:%s\n",x);
printf("q:%s\n",q);
}
出力: 1 セグメンテーション違反
これはあなたが持っているべきものです:
#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へのポインターへのポインターへのポインターを意味します。それが役立つことを願っています。
「セグメンテーション違反」は出力ではなく、プログラムがクラッシュしたことを示しています。
文字列リテラルは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);
}