为什么我收到分段错误?

时间:2015-03-31 02:47:26

标签: c segmentation-fault

#include<stdio.h>
#include<string.h>
void main()
{
int entry,i;
printf("\nPlease indicate the number of records you want to enter :\n");
scanf("%d",entry);
char ent[entry][100000];
printf("\nPlease input records of students (enter a new line after each record), with following format first name last name score \n");
for(i=0;i<entry;i++)
    {
    gets(ent[i]);
    printf("%s",ent[i]);
    }
}

以下是接受学生数据,名字姓氏然后得分的代码。

4 个答案:

答案 0 :(得分:2)

main应该返回int,而不是void

int main(void) {
    /* ... */
}

scanf("%d",entry);

scanf期望与"%d"格式说明符对应的参数为int *。但是,你的论点是int。也许你的意思是:

scanf("%d",&entry);

就此而言,您应该检查scanf的返回值。就你所知,用户没有输入任何数字。

if (scanf("%d", &entry) != 1) {
    exit(0);
}

实际上,这仍然允许用户输入负数。你有没有见过一系列负数的项目?对我来说似乎也很奇怪...我认为size_tint更合适(因此,您需要使用%zu格式说明符)。 ..

最后但并非最不重要的是,gets已被弃用,因为它无法阻止用户溢出缓冲区,这可能会导致段错误。


#include <stdio.h>
#include <string.h>
int main(void)
{
    size_t entry;
    printf("\nPlease indicate the number of records you want to enter :\n");
    if (scanf("%zu",&entry) != 1)
    {
        exit(0);
    }

    char ent[entry][100000];
    printf("\nPlease input records of students (enter a new line after each record), with following format first name last name score \n");
    for(size_t i=0; i<entry; i++)
    {
        fgets(ent[i], sizeof ent[i], stdin);
        printf("%s",ent[i]);
    }
}

答案 1 :(得分:1)

  1. 您应该使用int main()代替void main
  2. 当您使用时,应该scanf("%d",&entry)代替scanf("%d",entry),扫描需要的是一个地址。
  3. 你不应该使用gets(),这很危险,请尝试fgets()

答案 2 :(得分:1)

scanf("%d",entry);     //scanf("%d",&entry)
char ent[entry][100000]; //error

在编译时无法知道数组的长度时,应使用malloc来获取数组

答案 3 :(得分:0)

错误在scanf中使用scanf("%d",&entry)而不是scanf("%d",entry);

建议:使用int作为main

的返回类型