我的函数调用出了什么问题?

时间:2014-12-25 11:01:00

标签: c

我在函数调用点遇到分段错误。请帮助任何信息。我是编码的新手,所以你看到的其他任何帮助都会非常感激!分段错误发生在' main'功能

#include<stdio.h>
#include<stdlib.h>
#define MAX 100

void write();
void read();

int main()
{
    int x;

    while(x!=2)
    {
        printf("Type 0 to go to write program, type 1 to go to read program, type 2 to end program\n");
        scanf("%d",x);
        if(x==0)
            write();
        if(x==1)
            read();
    }
    return 0;
}

void write()
{
    FILE *finalptr;
    char name[MAX],gift[MAX];
    int none;

    if((finalptr=fopen("names.dat","w"))==NULL)
    {
        printf("File could not be opened\n");
    }

    else
    {
        printf("Enter the gifter's name2gift.\n");
        printf("Enter EOF to end input.\n");
        printf("? ");
        scanf("%s%d%s",name,none,gift);

        while(!feof(stdin))
        {
            fprintf(finalptr,"%s %s\n",name,gift);
            printf("? ");
            scanf("%s%d%s",name,none,gift);
        }
        fclose(finalptr);
    }
}

4 个答案:

答案 0 :(得分:3)

scanf("%d",&x);

读取变量的地址。哪个&x不是x。 由于你有%d作为scanf()的第一个论点,第二个参数应该是一个有效的内存位置(int *),应该读取值,在你的情况下x未初始化或x未指向任何有效的内存位置,这将导致分段错误。

修复所有scanf()'s

PS:使用未初始化的值将导致UB(值x未初始化且正在使用)

答案 1 :(得分:2)

scanf("%d",x);

scanf d转化说明符需要int *类型的参数,但您传递的是int。将此调用更改为scanf("%d", &x);

您在其他scanf来电中遇到同样的问题。

答案 2 :(得分:1)

您将x声明为整数,因此在scanf中您必须&scanf("%d",&x);

答案 3 :(得分:0)

int main()
{
int x;//Error here beacause you have to initialize x
//Though you may not get any errors chances of wrong output
while(x!=2)
 {
    printf("Type 0 to go to write program, type 1 to go to read program, type 2 to end program\n");
    scanf("%d",x);//scanf("%d",&x);
    if(x==0)
        write();
    if(x==1)
        read();
 }
return 0;
}

这有效。