c-struct和malloc内部的动态数组失败



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

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);
}

对函数加载的两个调用都返回预期结果(数据数组的字节数与文件的字节数相同)。第一个和第二个变量将不再使用。

然而,在几百行代码之后,程序总是崩溃:

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

崩溃总是发生在同一行代码上,但这一行与第一、第二个变量无关,甚至与结构A无关。

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

奖励:如果我只加载"file1",则不会发生崩溃,只要我同时加载"file2"one_answers"file1",崩溃就会再次出现。

很抱歉问题太长。

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

正如Joachim所说,读取操作非常耗时,您应该分块读取数据以最大限度地减少开销。

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

其他人已经给出了许多关于代码的问题。请检查以下

typedef struct A{
int size;
char * dataArray;
}A
A load(char* filename, int inSize)
{
    A newA;
    newA.size = inSize;
    FILE *filePtr = NULL ; //Use NULL 
    char buff[1]; //Size of buffer is only 1 ,If needed increase that to copy more at a time
    int i = 0;
filePtr = fopen(filename,"rb");    
//Try to check for the filePtr == NULL or not
newA.dataArray = ( char*)malloc(sizeof(char) * newA.size);
//Same checking should be done here
for (i = 0; i < size; i++) //What is size 
{
    fread(buff, sizeof(char), 1, filePtr);
    newA.dataArray[i] = char[0]; //What is char[0]
}
//instead this you can read the bytes in a single call, use that.
// fread(buff, sizeof(char), <size to read >, filePtr);
char* copyOfDataArray = (char*)malloc(sizeof(char) * newA.size);
for (i = 0; i < size; i++)
{
    fread(buff, sizeof(char), 1, filePtr);
    copyOfDataArray[i] = newA.dataArray[i];
}
//why reading again once you done above.
newA.dataArray = copyOfDataArray;
return newA; //Please check: How you can return a auto variable.
}
void Initialize()
{
    A first = load("file1", 100);
    A second = load("file2", 20);
}

最新更新