C-如何将文件*数组传递到函数中



我只需要知道如何将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.
  }
}