You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言函数返回字符串指针异常:新手打印字符串失败求助

C语言函数返回字符串问题分析与解决

错误核心原因

你的代码存在两个致命问题:

  • 野指针问题:read_data中的str1是局部栈数组,函数执行完毕返回时,栈上的局部变量会被系统回收。你将p_str1指向str1后返回,这个指针就变成了野指针——指向的内存已经不属于程序的有效内存,所以main函数中访问时会丢失内容。
  • 内存泄漏:你用malloc分配了内存给p_str1,但随后又把p_str1指向str1,导致malloc的内存地址丢失,无法通过free释放,造成内存泄漏。

修正方案一:使用堆内存存储输入

直接将输入写入malloc分配的堆内存,堆内存的生命周期由程序员控制,不会随函数返回而销毁:

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

char* read_data();

int main()
{
    char *p_str;

    p_str = read_data();

    if (p_str != NULL) {
        printf("entered string is: %s and pointer on that string is %p \n", p_str, p_str);
        free(p_str); // 必须释放堆内存,避免泄漏
    }

    return 0;
}

char* read_data()
{
    char *p_str1 = (char*)malloc(100 * sizeof(char));
    if (p_str1 == NULL) { // 检查内存分配是否成功
        return NULL;
    }

    // 用fgets替代不安全的gets,防止缓冲区溢出
    fgets(p_str1, 100, stdin);
    // 移除fgets读取的换行符(如果存在)
    char *newline = strchr(p_str1, '\n');
    if (newline != NULL) {
        *newline = '\0';
    }

    printf("entered string is: %s and pointer on that string is %p \n", p_str1, p_str1);
    return p_str1;
}

修正方案二:由调用者提供缓冲区

让main函数分配缓冲区并传入,避免使用堆内存,由调用者管理内存生命周期:

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

// 接收缓冲区指针和缓冲区大小
char* read_data(char *buf, size_t buf_size);

int main()
{
    char str[100];
    char *p_str;

    p_str = read_data(str, sizeof(str));

    if (p_str != NULL) {
        printf("entered string is: %s and pointer on that string is %p \n", p_str, p_str);
    }

    return 0;
}

char* read_data(char *buf, size_t buf_size)
{
    if (buf == NULL || buf_size == 0) {
        return NULL;
    }

    fgets(buf, buf_size, stdin);
    char *newline = strchr(buf, '\n');
    if (newline != NULL) {
        *newline = '\0';
    }

    printf("entered string is: %s and pointer on that string is %p \n", buf, buf);
    return buf;
}

内容的提问来源于stack exchange,提问作者KeyboardSound

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:50:21