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