12

次のコードがセグメンテーション違反で返されるのはなぜですか?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;
    }

乾杯!

4

5 に答える 5

20

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

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

于 2012-05-19T20:10:40.010 に答える
4

壊滅的に悪い:

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;
    }
于 2012-05-19T20:12:51.597 に答える
1

あなたscanf("%s", s);はコメントアウトされています。つまり、sは初期化されていないため、この行ln = strlen(s);を実行すると、セグメンテーション違反が発生します。

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

于 2012-05-20T19:42:14.427 に答える
1

さらに良い

#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;
}
于 2012-10-17T08:49:09.190 に答える