1

重複の可能性:
セグメンテーション違反-C

#include<stdio.h>
#include<string.h>
int main()
{
  char *p;

  printf("enter some thing:");
  gets(p);

  printf("you have typed:%s\n",p);
}

このプログラムが機能しないのはなぜですか?ポインタを文字列として使用できません。

出力は次のとおりです。

enter some thing:raihan
Segmentation fault (core dumped)

charポインタを使用するたびにこのエラーが発生します。どうすればこの問題を解決できますか?Linuxmint13KDEでコードブロックを使用しています。

4

6 に答える 6

3

メモリが割り当てられていません。ポインターを宣言したばかりですが、p何かを指すようにしませんでした。それはセグメンテーション違反を説明しています。バッファにメモリを割り当てる必要があります。

さらに、getsバッファの大きさを指定することはできません。そのため、バッファの終わりを超える危険があります。fgets代わりに使用してください。

int main(void)
{
    char buffer[1024];//allocates a buffer to receive the input
    printf("enter some thing: ");
    fgets(buffer, sizeof(buffer), stdin);
    printf("you have typed: %s\n", buffer);
    return 0;
}

の宣言も修正mainし、値が返されるようにしました。

于 2012-09-15T10:05:28.637 に答える
2

にメモリが割り当てられていませんp。また、fgets代わりにgetswhich を使用すると、入力バッファがオーバーフローする可能性があります。

于 2012-09-15T10:02:19.623 に答える
2
char *p;
printf("enter some thing:");
gets(p);

違う。Gets() は、指定されたポインターが指す配列を埋めようとします。そのポインターは初期化されていないため、segfault が発生します。使用する

char p[256];

または代わりにこのようなもの-ユーザーが255文字を超える文字列を入力した場合のバッファオーバーフローについて心配する必要があります。あなたはそれを解決することができます

fgets(p, sizeof(p), stdin);
于 2012-09-15T10:04:20.960 に答える
2

ポインターは宣言されていますが、初期化していないため、その値は、書き込みにアクセスできない任意のメモリ位置になります。したがって、これを読み書きするたびに、セグメンテーション違反のリスクが発生します。への呼び出しを使用してポインタにヒープメモリを割り当ててからmalloc、書き込み時にセグメンテーション違反を取得しません。

于 2012-09-15T10:05:47.420 に答える
1

ポインタを定義したところです - 文字用のメモリが割り当てられていません!

配列または malloc を使用します。

于 2012-09-15T10:01:45.640 に答える
1

ポインタは単なるメモリアドレスです。「ここにいくつかのデータがあります」と表示されます。しかし、実際にはそのデータを予約しません。

あなたの場合、問題は2つあります。ポインタは有効なメモリを指しておらず、何にも設定していません(したがって、ランダムな場所を指していました)。

これはさまざまな方法で修正できます。最も簡単な方法は、配列を使用することです (暗黙的にポインターのようなものです)。

char something[100];
printf("enter some thing:");
gets(something);

これにより、スタックに 100 文字が追加されます。必要に応じて指定することもできますが、この場合は少し冗長です。

char *p = something;

もう 1 つの方法は動的割り当てで、実行時にオペレーティング システムにバイト数を要求します。この方法では、使い終わったら返却する必要があります。

char *something = (char*)malloc( 100 * sizeof(char) );  // Ask for 100 chars
printf("enter some thing:");
gets(something);
free(something);  // Do this when you don't need that memory anymore.

PS: 文字列がある場合は、保存する文字数よりも常に 1 バイト余分に必要であることを忘れないでください。そのバイトは文字列ターミネータ用で、その値は 0 です。

于 2012-09-15T10:05:19.730 に答える