fprint无法打印从函数返回的指针引用的串联字符串

时间:2014-06-13 12:20:46

标签: c string printf

我有以下程序:

#include <stdio.h>

#define MAXLEN 100

char *my_strcat(char *strp1,char *strp2) {

    char str[MAXLEN], *strp;
    strp = str;
    while (*strp1 != '\0') {
        *strp++ = *strp1++;
    }
    while (*strp2 != '\0') {
        *strp++ = *strp2++;
    }
    *strp = '\0';
    strp = str;
    return strp;
}

void test_strcat(void) {

char *strp1, *strp2, *strp3, str1[MAXLEN], str2[MAXLEN];
printf("Testing strcat! Give two strings:\n");
gets_s(str1, sizeof(str1));
gets_s(str2, sizeof(str2));
strp1 = str1;
strp2 = str2;
strp3 = my_strcat(strp1, strp2);
printf("Concatenated string: %s", strp3);

}


int main(void) {
test_strcat();
}

函数char *mystrcat应该连接两个字符串,我用它来测试它 test_strcat。该程序运行没有错误,但不打印连接的字符串,打印一个笑脸符号。我通过调试和它完成了程序 似乎my_strcat发回的结果是正确的字符串。但是,什么时候 进入应该打印strp3的最后一行,它显示为红色 调试工具,意味着它的价值即将发生变化。在printf调用之后,strp3 不再指向连接的字符串。任何人都知道可能导致此错误的原因是什么?

2 个答案:

答案 0 :(得分:1)

问题在于:

char str[MAXLEN], *strp;
strp = str;  // str is a local variable
...
return strp; // <<== WRONG!!!

由于str是一个本地变量,一旦返回就会消失,strp指向的值将变为无效,即调用者获取控制权的实例。

使用malloc而不是在自动存储区域(即堆栈中)分配内存将解决此问题:

char *str = malloc(strlen(strp1)+strlen(strp2)+1);
char *strp = str;

答案 1 :(得分:0)

我建议您采取以下两种方式。

首先,

char *my_strcat(char *strp1,char *strp2) {
    static char str[MAXLEN * 2]; /* from char str[MAXLEN] */

第二

char *my_strcat(char *strp1,char *strp2) {
    char *str = malloc(strlen(strp1) + strlen(strp2) + 1);

因为在my_strcat函数中,您将str分配为自动变量。 当my_strcat函数完成时,str将被释放。