【发布时间】:2018-02-19 00:08:53
【问题描述】:
我只需要知道如何将FILE* 数组传递和声明到函数中
void openInputFiles(char* name, FILE* input[]){
char filename[10];
if (strcmp("average", name) == 0){
int i;
int k =1;
for (i=1;i<=10;i++){
if (i<10){
sprintf(filename,"%s_00%d",name,k);
}
if (i == 10){
sprintf(filename,"%s_0%d",name,k);
}
input[i-1] = fopen(filename,"r");
k++;
}
}
if (strcmp("median", name) == 0){
int i,k;
k=1;
for (i=1;i<10;i++){
sprintf(filename,"%s_00%d",name,k);
input[i-1] = fopen(filename,"r");
k++;
}
}
}
这是函数的代码,这是我试图调用它的地方
int main(int argc, char* argv[]){
FILE* input[10];
openInputFiles(argv[1],input);
}
当我编译它时我没有收到任何警告,但是当我尝试 gdb 它来测试有什么问题时,FILE* 似乎没有将内存地址分配给input[0],因为它说它在地址 @ 987654328@。我做错了什么?
【问题讨论】:
-
这些文件是否已经存在?
-
是的,它们是与 sprintf 同名的文件。
-
如果
fopen返回NULL,则表示打开文件时出错,您需要检查errno以查看问题所在:linux.die.net/man/3/fopen -
是的,
NULL为零(我不认为这是由标准强制执行的,这里有人会知道,但对于我曾经工作过的每个系统来说都是如此)。fopen正在返回 0,因为打开文件时出现问题,您需要检查errno以找出失败的原因。并且input[10]超出了您的数组范围,有效索引为 0 到 9。 -
@yano 常量文字
0用于检查空指针,它也是一个空指针常量。将void*强制转换为字面常量 0 也被视为空指针,这就是为什么NULL的定义通常为#define NULL ((void*) 0)。然而,这并不意味着NULL等于值 0,但我不知道有任何现代架构不是这种情况。见stackoverflow.com/a/1296865/1480131