如果目标字符串未初始化,strcpy的行为会有所不同

如果目标字符串未初始化,strcpy的行为会有所不同,c,string,huffman-code,C,String,Huffman Code,我在C语言中工作,试图创建一个哈夫曼解码器。这段代码只有在codearray未初始化的情况下才有效,否则它会给我一个分段错误。然而,valgrind抱怨说,如果我这样做的话,codearray是未初始化的。我用ddd检查了一下,一旦调用strcpy,就会出现segmentaion故障,我不知道为什么 void printtree_inorder(node* n,char* code,char* letarray,char** codearray) { if (n == NULL) {

我在C语言中工作,试图创建一个哈夫曼解码器。这段代码只有在codearray未初始化的情况下才有效,否则它会给我一个分段错误。然而,valgrind抱怨说,如果我这样做的话,codearray是未初始化的。我用ddd检查了一下,一旦调用strcpy,就会出现segmentaion故障,我不知道为什么

void printtree_inorder(node* n,char* code,char* letarray,char** codearray)
{
    if (n == NULL) {
        return;
    }
    static int counter=0;
    appenddigit(code,'0');
    printtree_inorder(n -> left,code,letarray,codearray);
    remdigit(code);
    if (n->let!='\0') {
       letarray[counter]=n->let;
       strcpy(codearray[counter],code);
       counter++;
    }
    appenddigit(code,'1');
    printtree_inorder(n -> right,code,letarray,codearray);
    remdigit(code);
}
以下是调用函数:

char code[100]={'\0'};
char** codearray=(char**)malloc(numchars*sizeof(char*));
for (i=0;i<numchars;i++) {
    codearray[i]=(char*)malloc(100*sizeof(char));
}


char* letarray=(char*)malloc((numchars+1)*sizeof(char));
letarray[0]='\0';

printtree_inorder(root,code,letarray,codearray);
char-code[100]={'\0'};
char**code数组=(char**)malloc(numchars*sizeof(char*);
对于(i=0;i可能在“initialized”调用中,数组根本没有正确初始化,因此函数崩溃

当“未初始化”时,数组可能包含(偶然)不会导致分段错误的值,这取决于程序以前对最终用于
codearray
的内存所做的操作

函数尝试将字符串复制到
coderaray[counter]
指向的任何位置:

strcpy(codearray[counter],code);
在函数调用中,您可以看到这个
codearray[counter]
是一个随机值,因为只有数组被malloc'ed,但元素没有初始化为任何特定值。
strcpy()
然后尝试写入该随机内存地址

您必须为字符串的副本分配内存,例如使用
strdup()
而不是
strcpy()

只创建一个char*数组,但它们不指向任何有效内存。 所以,您的“初始化代码”只是确保正确创建了内存

另一件真正让我害怕的事情是,你的计数器变量是静态的。 召唤

也将以分段错误结束,因为当您第二次(从外部)调用计数器时,计数器将>然后是numchars。 所以,让我们重写一下你的代码,让它更安全

char* code = (char *)malloc(numchars + 1);
memset(code, 0, numchars + 1);

char* letarray = (char *)malloc(numchars + 1);
memset(letarray, 0, numchars + 1);

char** codearray = (char **)malloc(numchars * sizeof(char *));
memset(codearray, 0, numchars * sizeof(char *));

printtree_inorder(root, code, letarray, codearray, 0);

free(code);
// do not forget the free the other allocations later as well as


void printtree_inorder(node* n,char* code,char* letarray,char** codearray, int counter)
{
    if (n == NULL) {
        return;
    }
    appenddigit(code,'0');
    printtree_inorder(n -> left,code,letarray,codearray, counter);
    remdigit(code);
    if (n->let!='\0') 
    {
       letarray[counter] = n->let;
       codearray[counter] = strdup(code);
       ++counter;
    }
    appenddigit(code,'1');
    printtree_inorder(n -> right,code,letarray,codearray, counter);
    remdigit(code);
}

你能展示执行分配和调用此函数的代码appenddigit和remdigit做什么?numchars的值是多少?还有为什么你的计数器声明为静态?我从来没有听说过strdup,但我会这样使用它吗?codearray[counter]=strdup(代码,100)?例如,请参阅:数组的元素已分配这似乎可行,但稍后当我调用strcmp(“string”,codearray[I])时,它会因分段而崩溃fault@Free_D,您是否肯定i是char** codearray=(char**)malloc(numchars*sizeof(char*));
printtree_inorder(root,code,letarray,codearray);
printtree_inorder(root,code,letarray,codearray);
char* code = (char *)malloc(numchars + 1);
memset(code, 0, numchars + 1);

char* letarray = (char *)malloc(numchars + 1);
memset(letarray, 0, numchars + 1);

char** codearray = (char **)malloc(numchars * sizeof(char *));
memset(codearray, 0, numchars * sizeof(char *));

printtree_inorder(root, code, letarray, codearray, 0);

free(code);
// do not forget the free the other allocations later as well as


void printtree_inorder(node* n,char* code,char* letarray,char** codearray, int counter)
{
    if (n == NULL) {
        return;
    }
    appenddigit(code,'0');
    printtree_inorder(n -> left,code,letarray,codearray, counter);
    remdigit(code);
    if (n->let!='\0') 
    {
       letarray[counter] = n->let;
       codearray[counter] = strdup(code);
       ++counter;
    }
    appenddigit(code,'1');
    printtree_inorder(n -> right,code,letarray,codearray, counter);
    remdigit(code);
}