繁体   English   中英

奇怪的char ** / calloc行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM