C

时间:2016-03-09 08:38:50

标签: c pointers

在下面的代码中,line[]数组包含文件夹中包含的所有图像文件的名称。我们只是动态地读取名称并将文件名逐个发送到代码中给出的函数function_foo。当有8个图像时,代码按预期执行。但是,只要我们将文件夹中的图像文件数量增加到8以上的任何数字,进程就会终止并返回-1。请建议。

FILE **fp;
struct Structure_Name data[100];
fp = malloc( sizeof(FILE *) * 10000);

for(i=0;i<total; i++)
{
  sprintf(fName,"/home/souvik/Images/%s",line[i]);
  printf("%s\n",fName);
  fp[i] = fopen(fName, "rb");
  data[i]=function_foo(fp[i],(data[i]));
}

2 个答案:

答案 0 :(得分:2)

同时打开10000个文件是一个非常糟糕的主意。我建议您更改此逻辑:逐个阅读这些文件的内容,并将此内容发送到您的函数function_foo。但是目前你的代码尝试fopen非常大量的文件而不关闭它。我希望这是主要问题(即在您的环境中,似乎可以打开的最大文件数为8)。

另见:

<强>更新

由于您不需要所有指针的数组,因此您可以尝试以下版本。在这种情况下,您是否看到同样的问题?

FILE *fp;
struct Structure_Name data[100];

for(i=0; i<total; i++)
{
  sprintf(fName,"/home/souvik/Images/%s", line[i]);
  printf("%d of %d, %s\n", i, total, fName);
  fp = fopen(fName, "rb");
  if (fp != NULL)
  {
    data[i]=function_foo(fp,(data[i]));
    fclose(fp);
  } else
  {
    printf("A null pointer is returned by fopen()");
  }
}

答案 1 :(得分:0)

@ALL,感谢您的积极帮助。

现在问题解决了。问题的根本原因是,当程序循环遍历所有图像时,它将图像数据存储在data [i]中,即数据[1],数据[2],数据[3],数据[4] .........在程序执行期间,数据临时存储在\ var文件夹中。在读取9个图像文件后,9个图像(数据[1] +数据[2] +数据[3] + .....数据[9])的总大小超过了我们机器中\ var的大小。我们简单地在每次迭代后取消分配为结构变量data [i]分配的空间。这解决了这个问题。