[英]Strange char**/calloc behavior
当我调试以下代码时, 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]]));
}
for
循环init中的int i(1)
可能应该是int i(0)
。
否则,您永远不要将parent_var_names[0]
设置为calloc()
初始化为0
以外的任何0
。
仅出于完整性考虑(因为在注释中多次提到了此问题),您没有考虑要复制的字符串的'\\ 0'终止符。 由于您没有在strncpy()
调用中复制终止符,因此不会溢出分配的缓冲区,但结果不是正确终止的字符串。 这可能是您的意图,但这是不寻常的。 如果有意,请在此处发表评论...
(Microsoft)调试堆的功能是在内存的分配区域周围放置保护字节(即0xFDFDFDFD)。 看到您遇到了该值,或者意味着您正在某个地方覆盖内存,或者您正在查看parent_var_names[0]
的值而实际上没有在其中写入任何内容(即仔细查看初始化循环变量i
的值)。
此外,您的代码可以简化为:
#include <string>
/* ... */
int ii = 0;
int parent_count = net->nodes[x]->num_parents;
char** parent_var_names = calloc(parent_count, sizeof(char*));
for(; ii < parent_count; ++ii)
{
parent_var_names[ii] = strdup(rhs_arr[net->nodes[x]->markov_parents[ii]]);
}
还要确保您的markov_parents绝对是零终止的。 顺便说一句,响应您的评论,您想要“ C和C ++兼容性”:您的代码不是有效的C代码,因此...
如果您的parent_var_names
不以NULL终止,则可能是因为在为字符串分配空间时使用了strlen
。 这无法为字符串和 NULL终止符创建空间。 尝试使用strlen()+1
代替。
无论如何,您可能应该使用std :: string ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.