我们编写了一个程序,它将逗号分隔的整数值读入数组,并尝试使用并行结构处理它们。 通过这样做,我们发现动态数组的最大大小存在固定限制,通常通过将大小加倍来动态分配。然而,对于具有超过5000个值的数据集,我们不能再将其加倍。
我现在有点困惑,因为从技术上讲,我们按照其他帖子指出的方式做了所有事情(使用realloc,不要使用堆栈而是使用堆)。
请注意,它适用于任何小于或等于5000的值的文件。 我们也尝试使用realloc,但结果相同。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// compile with gcc filename -lpthread -lm -Wall -Wextra -o test
int reader(int ** array, char * name) {
FILE *fp;
int data,row,col,count,inc;
int capacity=10;
char ch;
fp=fopen(name,"r");
row=col=count=0;
while(EOF!=(inc=fscanf(fp,"%d%c", &data, &ch)) && inc == 2){
if(capacity==count)
// this is the alternative with realloc we tried. Still the same issue.
//*array=malloc(sizeof(int)*(capacity*=2));
*array = realloc(*array, sizeof(int)*(capacity*=2));
(*array)[count++] = data;
//printf("%d ", data);
if(ch == '\n'){
break;
} else if(ch != ','){
fprintf(stderr, "format error of different separator(%c) of Row at %d \n", ch, row);
break;
}
}
// close file stream
fclose(fp);
//*array=malloc( sizeof(int)*count);
*array = realloc(*array, sizeof(int)*count);
return count;
}
int main(){
int cores = 8;
pthread_t p[cores];
int *array;
int i = 0;
array=malloc(sizeof(int)*10);
// read the file
int length = reader(&array, "data_2.txt");
// clean up and exit
free(array);
return 0;
}
编辑:我包含了我们尝试的realloc命令,并将值更改回原始测试值(从10开始)。这虽然没有影响结果,或者仍然不起作用。无论如何,谢谢你指出错误!我还将包含的代码减少到相关部分。
我无法理解它应该以这种方式工作的事实,但事实并非如此,所以它可能只是我们忽略的一个小错误。 提前谢谢。
答案 0 :(得分:2)
问题更新后的新答案
使用realloc
是错误的。始终将realloc
放入新指针并在覆盖旧指针之前检查NULL。
像:
int* tmp = realloc(....);
if (!tmp)
{
// No more memory
// do error handling
....
}
*array = tmp;
原始答案(问题更新后不完全有效)
您当前的代码存在严重问题。
在main
中你有:
array=malloc(sizeof(int)*10); // This only allocates memory for 10 int
int length = reader(&array, "data_1.txt");
并且reader
你有:
int capacity=5001;
所以你假设阵列容量是5001,即使你只保留了10的内存来开始。所以你最终写在保留数组之外(即未定义的行为)。
更好的方法是处理函数中的所有分配(即不要在main
中进行任何分配)。如果你这样做,你应该将capacity
初始化为0
并重写容量增长的方式。
此外,在reader
中你有:
if(capacity==count)
*array=malloc(sizeof(int)*(capacity*=2));
使用malloc
是错误的,因为您丢失了数组中已有的所有数据并且泄漏了内存。请改用realloc
。
最后,你有:
*array=malloc( sizeof(int)*count);
由于与上述相同的原因,这也是错误的。如果您想调整大小(即计数),请使用realloc