0
#include<stdio.h>
int main()
{
    char *ch;
    int n=10;
    gets(ch);
    puts(ch);
    printf("%d\n",n);

}   

#include<stdio.h>
int main()
{
    char *ch;
    int n=10;
    gets(ch);
    printf("%d\n",n);
    puts(ch);

}   

1 つ目では、セグメンテーション エラーは print(n) で発生し、2 つ目では puts(ch) で発生します。n を宣言した直後に print(n) も使用されている場合、エラーは発生しません。

4

3 に答える 3

7

gets()未定義の動作を引き起こしている、初期化されたポインターを逆参照しています。

読み取り文字数を制限する方法がないため、メモリを割り当ててch使用しないでください。つまり、宛先配列の境界を超えて書き込む可能性があります。gets()

使用例fgets()

char ch[128];
if (fgets(ch, 128, stdin))
{
}
于 2013-06-25T20:13:21.800 に答える
1

fgets を使用し、(malloc を介して) 「バッファ」にメモリを割り当てて、指定された文字列を保持します。最後に、ポインターを無料で呼び出します。

于 2013-06-25T20:14:06.037 に答える
0
#include<stdio.h>
#include<stdlib.h>
    int main(){
        char * ch = (char*) malloc(sizeof(char)*10);
        //or by using this: char ch[10];
        int n=10;
        gets(ch);
        puts(ch);
        printf("%d\n", n);
        free(ch);
}
于 2013-06-26T02:42:31.830 に答える