次のコードがセグメンテーションフォールトで戻るのはなぜですか? 7行目をコメントアウトすると、セグフォールトが消えます。
int main(void){
char *s;
int ln;
puts("Enter String");
// scanf("%s", s);
gets(s);
ln = strlen(s); // remove this line to end seg fault
char *dyn_s = (char*) malloc (strlen(s)+1); //strlen(s) is used here as well but doesn't change outcome
dyn_s = s;
dyn_s[strlen(s)] = '\0';
puts(dyn_s);
return 0;
}
乾杯!
s
は初期化されていないポインターです。メモリ内のランダムな場所に書き込んでいます。これにより、undefined behaviourが呼び出されます。
s
にメモリを割り当てる必要があります。また、 gets
を使用しないでください ;割り当てたメモリがオーバーフローするのを防ぐ方法はありません。代わりにfgets
を使用してください。
壊滅的に悪い:
int main(void){
char *s;
int ln;
puts("Enter String");
// scanf("%s", s);
gets(s);
ln = strlen(s); // remove this line to end seg fault
char *dyn_s = (char*) malloc (strlen(s)+1); //strlen(s) is used here as well but doesn't change outcome
dyn_s = s;
dyn_s[strlen(s)] = '\0';
puts(dyn_s);
return 0;
}
より良い:
#include <stdio.h>
#define BUF_SIZE 80
int
main(int argc, char *argv[])
{
char s[BUF_SIZE];
int ln;
puts("Enter String");
// scanf("%s", s);
gets(s);
ln = strlen(s); // remove this line to end seg fault
char *dyn_s = (char*) malloc (strlen(s)+1); //strlen(s) is used here as well but doesn't change outcome
dyn_s = s;
dyn_s[strlen(s)] = '\0';
puts(dyn_s);
return 0;
}
ベスト:
#include <stdio.h>
#define BUF_SIZE 80
int
main(int argc, char *argv[])
{
char s[BUF_SIZE];
int ln;
puts("Enter String");
fgets(s, BUF_SIZE, stdin); // Use fgets (our "cin"): NEVER "gets()"
int ln = strlen(s);
char *dyn_s = (char*) malloc (ln+1);
strcpy (dyn_s, s);
puts(dyn_s);
return 0;
}
scanf("%s", s);
はコメント化されています。これはsが初期化されていないことを意味するため、この行ln = strlen(s);
が実行されると、セグエラーが発生します。
ポインターをNULLに初期化し、ポインターを使用する前にNULLをテストすることは常に役立ちます。
char *s does not have some memory allocated . You need to allocate it manually in your case . You can do it as follows
s = (char *)malloc(100) ;
未知の場所を参照することはもうないので、これはセグメンテーション違反エラーにつながりません。
さらに良い
#include <stdio.h>
int
main(void)
{
char *line = NULL;
size_t count;
char *dup_line;
getline(&line,&count, stdin);
dup_line=strdup(line);
puts(dup_line);
free(dup_line);
free(line);
return 0;
}