奇怪的char ** / calloc行为

时间:2010-10-01 20:51:29

标签: c++

当我调试以下代码时,strncpy工作正常,但一旦循环退出,我就会看到parent_var_names指向NULL/0xfdfdfddf。我很困惑!

parent_var_names = (const char**)calloc(net->nodes[x]->num_parents, sizeof(const char*));
for(int i(1); i < net->nodes[x]->num_parents; ++i)
{
  parent_var_names[i] = (const char*)malloc(strlen(rhs_arr[net->nodes[x]->markov_parents[i]]));
  strncpy((char*)parent_var_names[i], (char*)rhs_arr[net->nodes[x]->markov_parents[i]], strlen(rhs_arr[net->nodes[x]->markov_parents[i]]));
}

3 个答案:

答案 0 :(得分:3)

int i(1)循环初始化中的

for应该是int i(0)

否则,您永远不会将parent_var_names[0]设置为0calloc()初始化为strncpy()以外的任何内容。

为了完整性(因为在评论中提到了几次),你没有考虑要复制的字符串的'\ 0'终止符。由于您没有在{{1}}调用中复制终结符,因此您不会溢出分配的缓冲区,但结果不是正确终止的字符串。这可能是你的意图,但那是不寻常的。如果有意,请在那里发表评论...

答案 1 :(得分:3)

在分配的内存区域周围放置保护字节(即0xFDFDFDFD)是(Microsoft)调试堆的一个特性。看到你遇到这个值或者意味着你在某处覆盖了内存,或者你正在查看parent_var_names[0]的值而没有实际在那里写任何东西(即仔细查看你初始化循环变量的值{{1 }}与)。

此外,您的代码可以简化为:

i

还要确保您的markov_parents绝对是零终止的。顺便说一句,回应你的评论,你想要“C和C ++兼容性”:你的代码不是有效的C代码,所以......

答案 2 :(得分:1)

如果parent_var_names未终止NULL,则可能是因为在为字符串分配空间时使用strlen。这无法为字符串 NULL终止符创建空间。请改为strlen()+1

你可能应该使用std :: string ......