【问题标题】:Cannot allocate memory for a structure无法为结构分配内存
【发布时间】:2017-12-10 15:48:59
【问题描述】:

我正在尝试编写一个程序来通过静态 HUFFMAN 算法压缩/提取文件。我已经完成了我的代码,当我使用文件 .txt 进行测试时,一切正常。但是当我使用另一个文件(例如:mp3、docx 等)进行测试时,编译器会警告错误:“无效的空指针”detail picture

过了一会儿,我找到了出错的那一行,但我不明白为什么这行出错了:".exe 已触发断点。" detail picture

这是我的结构和功能:

struct BITCODE
{
char *bit;
int size;
};
BITCode **bitTable;



#define MAX_UNSIGNED_CHAR 256
#define MAX 10
bool Allocate(int size, bool isCompress)
  {
//allocate hufftree
huffTree = new HUFFNode*[size];
if (huffTree == NULL)
    return false;

for (int i = 0; i < size; i++)
{
    huffTree[i] = new HUFFNode[MAX_NODE];
    if (huffTree[i] == NULL)
        return false;
}
//allocate frequency and bittable
freq = new long*[size];
if (freq == NULL)
    return false;

if (isCompress == true)
{
    bitTable = new BITCode*[size];
    if (bitTable == NULL)
        return false;
}
for (int i = 0; i < size; i++)
{
    freq[i] = new long[MAX_UNSIGNED_CHAR];
    if (freq[i] == NULL)
        return false;

    if (isCompress == true)
    {
        bitTable[i] = new BITCode[MAX_UNSIGNED_CHAR];
        if (bitTable[i] == NULL)
            return false;
    }
    for (int j = 0; j < MAX_UNSIGNED_CHAR; j++)
        freq[i][j] = 0;
}
}

void createBit_Table(int nRoot, int num)
{
for (int i = 0; i < MAX_UNSIGNED_CHAR; i++)
{
    bitTable[num][i].size = 0;
    bitTable[num][i].bit = NULL;
}
char bit[MAX];
int size = 0;
processHuffTree(nRoot, bit, 0,num);
}

void processHuffTree(int nNode,char bit[], int size,int num)
{
if (nNode == -1) //If it's a NULL tree
    return;
//process node leaf
if (huffTree[num][nNode].left == -1 && huffTree[num][nNode].right == -1)
{
    bitTable[num][nNode].bit = new char[size + 1]; //CAUSE ERROR
    bitTable[num][nNode].size = size;

    for (int i = 0; i < bitTable[num][nNode].size; i++)
        bitTable[num][nNode].bit[i] = bit[i];

    bitTable[num][nNode].bit[size] = '\0';

}
else
{
    //turn left
    bit[size] = '0';
    processHuffTree(huffTree[num][nNode].left, bit, size + 1,num);

    //turn right
    bit[size] = '1';
    processHuffTree(huffTree[num][nNode].right, bit, size + 1, num);
}
}

【问题讨论】:

  • 请不要使用屏幕截图来提供文本。将文本复制粘贴到您的问题中。
  • @alk 对不起,先生,我已经编辑了我的问题。
  • @Minh 请在进一步询问之前仔细阅读here
  • 您所做的代码是否显示我们正确初始化bitTable 以实际指向有效内存?

标签: c++ memory allocation huffman-code


【解决方案1】:

第一部分包含一个致命错误(我怀疑它是否可以编译):

struct BITCODE
{
    char *bit;
    int size;
}
BITCode **bitTable; 

您混淆了大小写和结构定义。你需要一个分号来表示结构的结束:

    int size;
}; // a semicolon
BITCODE bitTable; // CAPITALIZATION!

那么,您没有为bitTable 分配任何内存。预计您应该这样做。

// somewhere in the beginning:
bitTable = new BITCODE*[MAX];
// inside createBit_Table()
bitTable[num] = new BITCODE[MAX_UNSIGNED_CHAR];

【讨论】:

  • 我已经为 bitTable 分配了内存
  • @Minh 见第一部分。
  • @PaulOgilvie 这是 C++ 而不是 C。
  • 我看到...在 C++ 中,struct 命名空间和 typedef 命名空间是相同的。它编译。道歉。
猜你喜欢
  • 2015-01-05
  • 2016-01-27
  • 2011-06-01
  • 1970-01-01
  • 2010-11-20
  • 2019-09-23
  • 2014-05-21
  • 2014-04-21
相关资源
最近更新 更多