为动态数组分配大 space
Allocating large space for dynamic array
我们编写了一个程序,将以逗号分隔的整数值读取到数组中,并尝试使用并行结构处理它们。
通过这样做,我们发现动态数组的最大大小存在固定限制,通常通过将大小加倍来动态分配。然而对于超过 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-command 并将值更改回我们的原始测试值(从 10 开始)。但这并没有影响结果,或者更确切地说仍然不起作用。无论如何感谢指出错误!我也将包含的代码减少到相关部分。
我无法真正理解它应该以这种方式工作,但实际上却没有,所以这可能只是我们忽略的一个小错误。
提前致谢。
New answer after question has been updated
realloc
的使用是错误的。始终对新指针执行 realloc
并在覆盖旧指针之前检查 NULL。
喜欢:
int* tmp = realloc(....);
if (!tmp)
{
// No more memory
// do error handling
....
}
*array = tmp;
Original answer (not fully valid after question has been updated)
你的当前代码有一些严重的问题。
在 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
我们编写了一个程序,将以逗号分隔的整数值读取到数组中,并尝试使用并行结构处理它们。 通过这样做,我们发现动态数组的最大大小存在固定限制,通常通过将大小加倍来动态分配。然而对于超过 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-command 并将值更改回我们的原始测试值(从 10 开始)。但这并没有影响结果,或者更确切地说仍然不起作用。无论如何感谢指出错误!我也将包含的代码减少到相关部分。
我无法真正理解它应该以这种方式工作,但实际上却没有,所以这可能只是我们忽略的一个小错误。 提前致谢。
New answer after question has been updated
realloc
的使用是错误的。始终对新指针执行 realloc
并在覆盖旧指针之前检查 NULL。
喜欢:
int* tmp = realloc(....);
if (!tmp)
{
// No more memory
// do error handling
....
}
*array = tmp;
Original answer (not fully valid after question has been updated)
你的当前代码有一些严重的问题。
在 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