当我调试以下代码时,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]]));
}
答案 0 :(得分:3)
int i(1)
循环初始化中的 for
应该是int i(0)
。
否则,您永远不会将parent_var_names[0]
设置为0
将calloc()
初始化为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 ......