0

namecharポインタとして置くと、悪いエラーが発生します。配列として入れても大丈夫ですが、同じ状況で*p3問題ありません。なぜだけエラーが発生するのnameですか?初期化も機能しませんでした。

#include <stdio.h>
#include <conio.h>
#include <string.h>
int main()
{
    int dex;
    const int k = 5;
    char *name;
    char *p3 = "happy world";
    char *list[k]={"kamy",
        "frank",
        "chris",
        "sara",
        "ricky"};

    scanf("%s",name);
    //or gets(name);
    printf("printed name is <%s>", name);
    getch();
    return 0;
}
4

6 に答える 6

1

name最初に使用するためにメモリを割り当てる必要がありますmalloc

name = malloc(20);
scanf("%19s", name);

そして、完了したら、割り当てられたメモリを解放する必要があります。

free(name);
于 2012-12-30T21:55:40.947 に答える
0

name何かを指すように初期化されていないため、メモリ内のランダムな場所を指します。これを使用すると、未定義の動作が呼び出されます。

配列として宣言するか、メモリを割り当てます。

静的な文字列を指すように割り当てられているため、どちらにp3も渡さないでください。scanf()

そして、決して使用しないでくださいgets()。これまで。

于 2012-12-30T21:56:54.210 に答える
0

コンパイラの警告を増やすと、エラーが指摘されます。nameは初期化されていないポインタであるため、どこを指していても、それが指している場所に書き込もうとすると、未定義の動作が発生し、運が良ければセグメンテーション違反が発生する可能性があります。

name配列として宣言するかmalloc、メモリのブロックを割り当てるためにを使用して初期化します。

また、バッファオーバーフローを回避するために指定子を使用fgetsするか、少なくともバッファオーバーフローを回避するために幅指定子を渡す必要があります。使用する場合は、バッファにも保存されることに注意してください。scanf%sscanffgets'\n'

すなわち。

char name1[30];
char *name2 = malloc(30 * sizeof(*name2));

fgets(name1, 30, stdin); // TODO - check return values
scanf("%29s", name2); // 30 - 1
//...
free(name2);
于 2012-12-30T21:57:34.073 に答える
0

p3[]メモリを自動的に割り当てますが、割り当て*p3ません。

使用するには、ユーザー関数*p3が必要です。malloc

于 2012-12-30T21:55:44.597 に答える
0

scanfstdinから入力をフェッチして、に配置することはできchar*ますが、メモリは割り当てられません。

試してみてください:

char name[64];
scanf("%s",name);

char *name文字のメモリを初期化しないことに注意してください。のように自動割り当てを使用するか、char name[64]で動的に割り当てる必要がありますchar *name = calloc(64, sizeof(char))。後者のアプローチを選択した場合は、メモリが不要になったときにメモリを解放する必要がありますfree(name)

于 2012-12-30T21:56:15.223 に答える
0

nameポインタとして宣言しますが、初期化することはありません。これは、scanf呼び出しで書き込もうとすると、一見ランダムなメモリ位置に書き込むことを意味します。これは未定義の動作であり、間違いなく奇妙なことが起こります。

文字列を保持する配列を作成する必要があります。

char name[32];

また、文字列の終わりを超えて書き込まないようにするには、おそらくscanf呼び出しをに変更して、長さがわかるようにする必要があります。

scanf("%31s", name);

行を取得している場合は、fgets代わりに次を使用する必要があります。

fgets(name, sizeof(name), stdin);

そしてちょっとしたヒントとして:あなたが呼び出す関数から返される値をチェックすることを忘れないでください、それらは失敗するかもしれません!

于 2012-12-30T21:56:21.257 に答える