c - 为动态数组分配大空间

标签 c malloc dynamic-arrays

我们编写了一个程序,将以逗号分隔的整数值读取到数组中,并尝试使用并行结构处理它们。 通过这样做,我们发现动态数组的最大大小存在固定限制,通常通过将大小加倍来动态分配。然而,对于具有超过 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

关于c - 为动态数组分配大空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40594070/

相关文章:

我可以存储指向 __PRETTY_FUNCTION__ 的指针以供以后使用,还是需要立即复制该字符串?

c++ uniTest Makefile问题

c - 我得到了 3 个结构,我必须使用堆并将一些数据输入到结构的成员中

c - 为什么堆栈内存 "cheaper"而不是 C 中的堆内存?

c - 在结构中打印动态分配数组时的未定义行为

javascript - 如何将自己的 <divs> 动态添加到容器中?

c - 内存分配问题

c++ - 引用范围外的数组

c - 如何阅读此 valgrind 信息

delphi - 为什么两个 TByte 不能使用重叠数据?