C 我的函数调用有什么问题?
我在函数调用点遇到分段错误。请提供任何信息。我是一个新的编码,所以帮助任何其他你会看到非常感谢!分段错误发生在“main”函数中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
#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;
}