有人可以解释一下这里有什么问题:
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;
}
上面的代码会产生随机崩溃。错误是:“内存无法写入”,“内存无法读取”,“堆栈已损坏”
答案 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个字符的独立数组。结果不连续;你不能以你的方式访问它。