gpt4 book ai didi

c - 结构内的动态数组和 malloc 失败

转载 作者:行者123 更新时间:2023-11-30 15:30:20 24 4
gpt4 key购买 nike

考虑以下从文件中读取一些字节的抽象代码:

typedef struct A{
int size;
char * dataArray;
}A

A load(char* filename, int inSize)
{
A newA;
newA.size = inSize;
FILE *filePtr;
filePtr = fopen(filename,"rb");

char buff[1];
int i = 0;

newA.dataArray = ( char*)malloc(sizeof(char) * newA.size);
for (i = 0; i < newA.size; i++)
{
fread(buff, sizeof(char), 1, filePtr);
newA.dataArray[i] = buff[0];
}

char* copyOfDataArray = (char*)malloc(sizeof(char) * newA.size);

for (i = 0; i < newA.size; i++)
{
fread(buff, sizeof(char), 1, filePtr);
copyOfDataArray[i] = newA.dataArray[i];
}

newA.dataArray = copyOfDataArray;
return newA
}

void Initialize()
{
A first = load("file1", 100);
A second = load("file2", 20);
}

对函数 load 的两次调用都返回预期结果(数据数组与文件具有相同的字节)。变量first和second再也不会被使用。

但是,在数百行代码之后,程序总是崩溃:

*malloc.c:2451: sYSMALLOC: Assertion '(old_top == (..... failed.*

崩溃总是发生在同一行代码上,但该行与变量 First、Second 甚至与结构 A 无关。

我的问题是:我实例化和加载“第一”和“第二”的方式是否错误?它是否会导致某种内存泄漏/内存溢出,从而在加载函数完成后很长时间内使程序崩溃?

奖励:如果我只加载“file1”,则不会发生崩溃,一旦我加载“file1”和“file2”,崩溃就会再次出现。

抱歉问了这么长的问题。

最佳答案

你那里有内存泄漏。在分配新内存之前,您必须释放 newA.dataArray 中先前分配的内存。

正如 Joachim 所说,读取操作非常耗时,您应该分块读取数据以尽量减少开销。

此外,您必须关闭文件描述符,否则它们很快就会耗尽。

关于c - 结构内的动态数组和 malloc 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25686230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com