このコードは正常にコンパイルされますが、実行中にセグメンテーション違反エラーが発生しますか? 誰でも理由がわかりますか?
#include <stdio.h>
#include <string.h>
#include <math.h>
int main() {
const char s2[] = "asdfasdf";
char* s1;
strcpy(s1, s2);
printf("%s", s1);
return 0;
}
このコードは正常にコンパイルされますが、実行中にセグメンテーション違反エラーが発生しますか? 誰でも理由がわかりますか?
#include <stdio.h>
#include <string.h>
#include <math.h>
int main() {
const char s2[] = "asdfasdf";
char* s1;
strcpy(s1, s2);
printf("%s", s1);
return 0;
}
単一のポインタ,s1
にスペースを割り当てましたが、 が指すバイトには割り当てていませんs1
。
解決策は、メモリを動的に割り当てることですs1
。
s1 = (char *)malloc(strlen(s2) + 1);
strcpy(s1, s2);
最後に暗黙のバイトがあるためmalloc
、文字数よりも1 バイト多いメモリ ( への呼び出しの +1) を割り当てる必要があることに注意してください。s2
NULL
詳細については、 C メモリ管理 (スタック オーバーフロー)を参照してください。
s1 にメモリを割り当てていません。s1 へのポインターがありますが、s2 の値をコピーするための strcpy に割り当てられたメモリがありません。
char *s1 = malloc( strlen(s2) + 1 );
strcpy( s1, s2 );
s1 にメモリを割り当てていません。それは何もないことへのポインタです。
char* s1 = malloc(sizeof(s2));
strcpy(s1, s2);
printf("%s", s1);
free(s1);
彼ら全員が言ったことは、あなたはs1のためにスペースを割り当てる必要があります。他のすべての人が投稿したものは問題なく機能しますが、既存の文字列にスペースを割り当てて新しいポインタにコピーする簡単な方法が必要な場合は、次のようにstrdupを使用します。
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
int main() {
const char s2[] = "asdfasdf";
char* s1;
s1 = strdup(s2);
printf("%s", s1);
return 0;
}
誰かが以前にstrdupについて言及しました、それはそれを使用する方法でしょう。これは標準のCライブラリにあるため、ほとんどのシステムでサポートされているはずです。しかし、どうやらそうでない人もいます。したがって、エラーが返された場合は、すでに説明した方法を使用して独自に作成するか、すでに説明した方法を使用してください;)
この問題に対処するための strdup (String Duplicate) の可能性を指摘した人はまだいません。
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
int main() {
const char s2[] = "asdfasdf";
char* s1;
s1 = strdup(s2); // Allocates memory, must be freed later.
printf("%s", s1);
free(s1); // Allocated in strdup, 2 lines above
return 0;
}
問題は、s1 に関連付けられたメモリがないことです。strcpy
呼びませんmalloc()
。
次のいずれかを実行できます。
char s1[10];
また
char *s1 = malloc(10);
宛先を割り当てる必要があります ( using namespace std;
C ではなく C++ であり、残りのコードは C です)。
ポインタ s1 にメモリを割り当てる必要があります。そうしないと、未知の場所を指しているため、セグメンテーション違反に到達します。正しいコードは次のとおりです。
#include <stdio.h>
#include <string.h>
#include <math.h>
int main() {
const char s2[] = "asdfasdf";
char* s1 = malloc(21 * sizeof(s2[0]));
strcpy(s1,s2);
printf("%s",s1);
return 0;
}