web-dev-qa-db-ja.com

セグメンテーション障害-C

次のコードがセグメンテーションフォールトで戻るのはなぜですか? 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;
    }

乾杯!

10
ceod

sは初期化されていないポインターです。メモリ内のランダムな場所に書き込んでいます。これにより、undefined behaviourが呼び出されます。

sにメモリを割り当てる必要があります。また、 getsを使用しないでください ;割り当てたメモリがオーバーフローするのを防ぐ方法はありません。代わりにfgetsを使用してください。

17

壊滅的に悪い:

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;
    }
3
paulsm4

scanf("%s", s);はコメント化されています。これはsが初期化されていないことを意味するため、この行ln = strlen(s);が実行されると、セグエラーが発生します。

ポインターをNULLに初期化し、ポインターを使用する前にNULLをテストすることは常に役立ちます。

1
octopusgrabbus
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) ;

未知の場所を参照することはもうないので、これはセグメンテーション違反エラーにつながりません。

1
Subbu

さらに良い

#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;
}
1
KAction