为动态数组分配较大的空间



我们编写了一个程序,将逗号分隔的整数值读入数组,并尝试用并行结构体处理它们。通过这样做,我们发现动态数组的最大大小有一个固定的限制,它通常通过将大小加倍来动态分配。然而,对于超过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开始)。但这并没有影响结果,或者说仍然不起作用。无论如何,谢谢你指出错误!我还减少了包含的代码到相关的部分。

我真的不明白应该这样工作,但是没有,所以这可能只是我们忽略的一个小错误。

问题后的新答案已更新

使用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

相关内容

  • 没有找到相关文章