我只需要知道如何将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]
,因为它在地址0x0
上说它。我在做什么错?
char filename[10];
...
sprintf(filename,"%s_00%d",name,k);
正如User3121023正确指出的那样,没有足够的空间将您分配给文件名分配给9个字符的"平均_001"(加上终止NUL
(。您需要使其char filename[12];
或更大。结果,您的程序表现出不确定的行为,这意味着可能会发生任何事情。
您也应该〜永远不要使用sprintf
-而不是使用snprintf
,并且始终检查错误,例如:
if (snprintf(filename, sizeof(filename), "%s_00%d", name, k) >= sizeof(filename)) {
abort(); // filename is too short.
您还可以简化循环(绝对无需处理i == 1至9的循环与i == 10:
不同for (i = 0; i < 10; i++) {
int n = snprintf(filename, sizeof(filename), "%s_%03d", name, i + 1);
if (n == -1 || n >= sizeof(filename) {
// handle format error or "filename" too short here.
}
input[i] = fopen(filename, "r");
if (input[i] == NULL) {
// handle fopen failure here.
}
}