次のコードがあります。
#include <string.h>
#include <stdio.h>
int main()
{
char * l;
*l = 'c';
*(l+1) = 'g';
*(l+2) = '\0';
char *second;
strcpy(second, l);
printf("string: %s\n", second);
}
私が実行すると、次
のように表示されます。出力には「セグメンテーション違反」と表示されます....
ありがとう
l
初期化されていないポインターです。逆参照することはできません。そのコンテンツを書き込むのに十分なスペースを割り当てる必要があります (静的 (1) または動的 (2))。
char l[3]; /* (1) */
#include <stdlib.h>
char *l = malloc(3); /* (2) */
strcpy
: second
is an unitialized pointer, you can't write it.と同じエラーです。
Segmentation Fault
あなたは間違いを軽視することを学ぶでしょう...
通常、自分のものではないメモリにアクセスしようとすると呼び出されます。最も一般的な発生は、範囲外の配列インデックスにアクセスしようとした場合です。
char *l
charへのポインタを作成するだけです。必要なのは、C では文字の配列として定義されている文字列です。l
そのため、指しているメモリ内の次の場所にアクセスしようとすると (これはおそらく単なるゴミになります)、自分のものではないメモリにアクセスすることになります。Segmentation Fault
malloc でメモリを取得するか、既存の変数へのポインターを指すことができます。
char word[3];
char *l;
l = word;
これで、そのような割り当てを行うことができます:
*l = 'c';
*(l+1) = 'g';
*(l+2) = '\0';
しかし、それを別のポインターにコピーしたいので、このポインターは別の文字列を指している必要があります。または、そのポインターにメモリを割り当てる必要があります。
char *pointer_to_second;
char second[3];
pointer_to_second = second;
または、動的メモリを取得する場合は、上記の 3 行を次のように変更します。
char *pointer_to_second = malloc(sizeof(char) * 3);
その後、あなたが望むことをすることができます:
strcpy(pointer_to_second, l);
ただし、C コンパイラを使用している場合は、最初にすべての変数を宣言する必要があります。そうしないと、エラーが発生します。C++ コンパイラを使用している場合は、気にする必要はありません。
ベクターに属さないフィールドにアクセスしようとすると、セグメンテーション違反が発生します。たとえば、これを試してみると:
printf("The value in position 3 of my pointer is %c\n", *(l + 3));
ポインターには 3 つの位置があり、4 番目の位置にアクセスしようとしているため、おそらくエラーが発生します。