簡體   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