我的char指针返回奇怪的字符串

ssd*_*ssd 0 c arrays string char

至于试图连接两个字符串(字符数组),下面的代码通过返回正确的结果return,但不是通过引用传递的参数(即,预期结果char *dstStrAdd功能).

关于"后"的结果; printf为st打印正确的连接字符串.但变量"s1"应该包含连接的字符串.然而,s1打印出一些奇怪的东西.

有人能弄清楚它有什么问题吗?

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

char *StrAdd (char *dst, const char *src) {
/*  add source string "src" at the end of destination string "dst"
    i.e. concatenate
*/
    size_t lenDst = strlen (dst);
    size_t lenSrc = strlen (src);
    size_t lenTot = lenDst + lenSrc + 1;
    char *sTmp = (char *) malloc (lenTot);
    memcpy (&sTmp [0], &dst [0], lenDst);
    memcpy (&sTmp [lenDst], &src [0], lenSrc);
    sTmp [lenTot - 1] = '\0';
    free (dst);
    dst = (char *) malloc (lenTot);
    memcpy (&dst [0], &sTmp [0], lenTot);
    free (sTmp);
    return (dst);
}

int main () {
    char *s1 = strdup ("Xxxxx");
    char *s2 = strdup ("Yyyyy");
    char *st = strdup ("Qqqqq");

    printf ("s1 before: \"%s\"\n", s1);
    printf ("s2 before: \"%s\"\n", s2);
    printf ("st before: \"%s\"\n", st);
    printf ("\n");

    st = StrAdd (s1, s2);

    printf ("s1 after : \"%s\"\n", s1); // weird???
    printf ("s2 after : \"%s\"\n", s2); // ok
    printf ("st after : \"%s\"\n", st); // ok
    printf ("\n");

    return (0);
}
Run Code Online (Sandbox Code Playgroud)

250*_*501 8

您传递s1给该函数,然后在其上调用free.执行此操作后,指针不再有效,您无法使用它.如果你这样做,就像你在printf()中所做的那样,你会得到未定义的行为.