C 我的函数调用有什么问题?

C 我的函数调用有什么问题?,c,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 progra

我在函数调用点遇到分段错误。请提供任何信息。我是一个新的编码,所以帮助任何其他你会看到非常感谢!分段错误发生在“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);
    }
}
#包括
#包括
#定义最大值100
无效写入();
无效读取();
int main()
{
int x;
while(x!=2)
{
printf(“键入0以写入程序,键入1以读取程序,键入2以结束程序\n”);
scanf(“%d”,x);
如果(x==0)
write();
如果(x==1)
read();
}
返回0;
}
无效写入()
{
文件*finalptr;
字符名称[MAX],礼物[MAX];
int无;
if((finalptr=fopen(“names.dat”,“w”))==NULL)
{
printf(“无法打开文件\n”);
}
其他的
{
printf(“输入礼物者的姓名2礼物。\n”);
printf(“输入EOF以结束输入。\n”);
printf(“?”);
scanf(“%s%d%s”,名称,无,礼物);
而(!feof(stdin))
{
fprintf(finalptr,“%s%s\n”,名称,礼物);
printf(“?”);
scanf(“%s%d%s”,名称,无,礼物);
}
fclose(finalptr);
}
}
scanf
d
转换说明符需要类型为
int*
的参数,但您传递的是
int
。将此调用更改为
scanf(“%d”和&x)

您在其他
scanf
调用中遇到了相同的问题

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

修复所有的
scanf()

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


这是有效的。

您将
x
声明为整数,因此在
scanf
中,您必须将
放在
scanf(“%d”和&x)中

作为一般建议,学习使用调试器。进一步的一般建议:不要使用标准库中的函数名,如
read()
write()
。同时打开编译器警告并注意产生的警告-如果您允许,编译器将帮助您修复许多错误。函数名“write”和“read”是stdio.h中定义的标准名称,因此(如果是我)我会使用一些独特的名称,如“myWrite”和“myRead”。这两行:void write();无效读取();应为:作废写入(作废);和无效读取(无效);请注意,当scanf具有以下格式字符串时,我对函数名与stdio.hw中的名称冲突的评论:“scanf(“%s%d%s”,name,none,gift);”然后scanf无法确定一个字段的结束位置和下一个字段的开始位置。这行应该写得更像这样:如果(3==scanf(“%s%d%s”,name,&none,gift);1)始终测试输入函数返回的值以确保操作成功,2)前导“”将导致跳过前导空格(包括前一个换行符);3)用户输入应该/必须包含某种分隔符。4) 数组名称降级为数组的地址,但int参数需要指定的地址传递给
scanf
的第二个参数确实是问题所在,但您的描述非常不准确。函数
scanf
%d”
作为第一个参数,因此期望
int
变量的地址作为第二个参数。OP正在传递
x
的(未初始化)值,该值将
scanf
解释为有效内存地址,并在运行时尝试写入。结果通常是未定义的行为,因为我们不知道
x
的值是什么,但由于该值很可能不是有效的内存地址,因此结果将是内存访问冲突。@barakmanos同意!!现在更新了我的答案更详细
scanf("%d",&x);
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;
}