【问题标题】:fprint cannot print concatenated string referenced by pointer returned from functionfprint 无法打印函数返回的指针引用的连接字符串
【发布时间】:2014-06-13 12:20:46
【问题描述】:

我有以下程序:

#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 不再指向连接的字符串。任何人都知道可能导致此错误的原因是什么?

【问题讨论】:

  • 您正在返回一个局部变量。您需要使用 malloc 而不是数组。 char *strp = new char[MAXLEN];
  • 什么是str[MAXLEN]?它似乎未初始化,从未使用过,但它是您从函数返回的...strp = str; return strp;
  • *my_strcat()函数中通过char *strp=(char *)malloc(MAXLEN*sizeof(char));尝试。

标签: c string printf


【解决方案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;

【讨论】:

  • 非常感谢!我意识到也可以向函数 my_strcat 添加第三个参数,它是指向应该存储新字符串的内存的指针。一般来说,这些可能性中的哪一种更可取?
  • @user3337301 一般来说,这两种方法都是有效的。 malloc 方法在您不关心字符串的存储位置并且您不介意多花几纳秒管理内存时有效。采用输出缓冲区的方法本质上不太安全,因为它为缓冲区溢出提供了可能性,但同时它允许您处理堆栈和/或静态内存,从而可能节省重要的 CPU 时间(这变得相关当您编写设备驱动程序或类似的低级代码时)。
【解决方案2】:

我建议你以下两种方式。

首先,

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 将被释放。

【讨论】:

    猜你喜欢
    • 2021-03-16
    • 2021-04-27
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2022-01-15
    • 2011-01-21
    相关资源
    最近更新 更多