C字符串函数,指针返回null

时间:2017-02-02 14:02:29

标签: c memory-management

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void catTo(char *dest, const char *str1, const char *str2)
{
    dest = (char *) malloc(1 + strlen(str1)+ strlen(str2) );
    strcpy(dest, str1);
    strcat(dest, str2);
}

int main(int argc, char** argv) {
    char *str1 = "abcd";
    char *str2 = "defg";
    char *dest;
    catTo(dest, str1, str2);
    printf("%s",dest);

    return 0;
}

我一直试图让一个简单的str复制功能起作用,但是,当我打印出dest时,我得到&#34;(null)&#34;。我试过,把某些变量放在&amp; / *前面,但没有占上风。

2 个答案:

答案 0 :(得分:4)

不要将dest作为输入参数传递。它的起始值不是必需的(并且未定义),并且不会被catTo函数调用修改,这可以解释您的问题。

最好这样做:

char *catTo(const char *str1, const char *str2)
{
    char *dest = malloc(1 + strlen(str1)+ strlen(str2) );
    strcpy(dest, str1);
    strcat(dest, str2);
    return dest;
}

并且在来电者中:

char *dest = catTo(str1, str2);

答案 1 :(得分:4)

  

我试过,把某些变量放在&amp; / *前面,但没有取得胜利。

这是一种解决问题的可怕方法 - 你应该检查你对指针和值语义的知识,而不是随意在你的代码中添加运算符。

无论如何,问题在于您将dest作为char*传递,然后在dest内分配到catTo:因为您正在复制dest,您要分配给本地参数,而不是dest中的main实例。

您可以将dest作为char**

传递来解决此问题
void catTo(char **dest, const char *str1, const char *str2)
{
    *dest = malloc(1 + strlen(str1)+ strlen(str2) );
    strcpy(*dest, str1);
    strcat(*dest, str2);
}

int main(int argc, char** argv) {
    char *str1 = "abcd";
    char *str2 = "defg";
    char *dest;
    catTo(&dest, str1, str2);
    printf("%s",dest);

    return 0;
}

此外,每个malloc都应与相应的free匹配。在free(dest)完成相关操作后,请勿忘记致电main

int main(int argc, char** argv) {
    char *str1 = "abcd";
    char *str2 = "defg";
    char *dest;
    catTo(&dest, str1, str2);
    printf("%s",dest);
    free(dest);

    return 0;
}