错误使用memset?

时间:2014-02-22 12:36:11

标签: c++

有人可以解释一下这里有什么问题:

class test
{
public:
    char char_arr[100];
};

int main()
{
    test **tq = (test**)calloc(10, sizeof(test*));
    for(unsigned int i = 0; i < 10; i++)
        tq[i] = (test*)calloc(10,  sizeof(test));

    for(unsigned int i = 0; i < 10; i++)
        memset(tq, 0, sizeof(tq[0][0])*100);

    return 0;
}

上面的代码会产生随机崩溃。错误是:“内存无法写入”,“内存无法读取”,“堆栈已损坏”

2 个答案:

答案 0 :(得分:2)

test **tq = (test**)calloc(10, sizeof(test*));

...

for(unsigned int i = 0; i < 10; i++)
    memset(tq, 0, sizeof(tq[0][0])*100);

分配tq时,要求10 * sizeof(test*)个字节。但是当你调用memset时,你要求它设置sizeof(tq[0][0]*100)个字节。你肯定写的是你分配的更多字节。也许你的意思是:

for(unsigned int i = 0; i < 10; i++)
    memset(tq[i], 0, 10 * sizeof(test));

这是有道理的,因为:

    tq[i] = (test*)calloc(10,  sizeof(test));

分配tq[i]时,您分配了10 * sizeof(test)个字节。

答案 1 :(得分:2)

您对2D阵列感到困惑:

char x[10][10];

这是一个2D数组,它包含100个连续char s。

但是你已经分配了一堆指针,然后将它们分别指向10个字符的独立数组。结果不连续;你不能以你的方式访问它。