1

このコードに問題があります。gcc コンパイラを使用していますが、このコードをコンパイルして実行すると、seg fault が発生します。name_1 をポインターとして、name_2 を文字列として、2 つの変数を割り当てているだけです。2 つの値に文字列を入力しようとすると、セグ フォールトが発生します。このセグ フォールトは、使用しているポインター変数に常に関連付けられています。

以下に、エラーのコードとスクリーンショットを示します。

#include <stdio.h>

int main()
{
char *name_1 ;
char name_2[10] ;

/*      Getting 2 strings as an input from the user
        and is stored in the pointer variable name_1 and name_2*/
scanf("%s",name_1) ;
scanf("%s",name_2) ;

/*      Printing the values of the varibales 
        name_1 and name_2 in string format      */
printf("\n%s",name_1) ;
printf("\n%s",name_2) ;

printf("\n\n") ;
return 0 ;
}

このコードで私を助けてください。

セグフォルト

4

4 に答える 4

3

char *name_1;、ポインタです。最初は、ランダムなガベージを指しています。次に、プログラムの開始時にたまたま指し示すscanfランダムなガベージ アドレスに文字列を配置するように要求します。name_1これは未定義の動作です。適合する C 実装では、必要に応じて火曜日にのみこのプログラムを期待どおりに動作させることができます。:)

ポインターを渡す場合は、最初に有効なバッファーを指していることを確認する必要があります。

さらに、への呼び出しに間接違反のレベルがありますscanf--name_1は既にポインターです。へのポインターにポインターを渡したくありませんscanf。ただのポインタ。

于 2012-11-27T06:15:40.647 に答える
2

質問の元のバージョンには次のものが含まれていました。

char *name_1;
...
scanf("%s", &name_1);

その後、質問は次の内容を含むように改訂されました。

char *name_1;
...
scanf("%s", name_1);

name_1が指すスペースが割り当てられていません。また、char **(つまり&name_1) を、が与えられることを期待する形式で に渡しましscanf()た。%schar *

考えられる修正:

int main(void)
{
    char name_1[20];
    char name_2[10];

    scanf("%s", name_1);
    scanf("%s", name_2);

別の可能な修正:

int main(void)
{
    char name_0[20];
    char *name_1 = name_0;
    char name_2[20];

    scanf("%s", name_1);
    scanf("%s", name_2);
于 2012-11-27T06:16:43.940 に答える
0
char *name_1 ;
...
scanf("%s",&name_1) ;

name_1はダングリング ポインターであり、それを使用しようとしていますが、これは正しくありません。

于 2012-11-27T06:15:12.007 に答える
0

ポインターchar *name_1は何かを指している必要があります。原則として従う

Declaring a pointer variable does not create the type of variable, 
it points at. It creates a pointer variable. So in case you are pointing 
to a string buffer you need to specify the character array and a buffer 
pointer and point to the address of the character array.

推奨される変更:

  • char *name_1別の文字配列を指すようにするか、

  • あなたはそれを配列として持つことができます..

于 2012-11-27T06:33:55.913 に答える