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

如何在不使用全局数组的情况下,在主函数释放mystrcat动态分配的数组?

解决方法:去掉全局变量,让主函数管理动态内存

没问题,咱们来搞定这个需求——既要严格保留给定的char *mystrcat(char *s1, const char *s2)函数原型,又要彻底移除全局变量,同时让主函数能正确释放动态分配的内存。

核心思路

原来的代码用全局指针newstring传递堆内存地址完全没必要。我们可以直接在mystrcat函数内部动态分配内存,然后把指向这块内存的指针返回给主函数——堆内存不会随函数调用结束而销毁,主函数拿到指针后就能完全掌控它的生命周期,包括最后释放。

修改后的完整代码

#include <stdio.h>
#include <stdlib.h> // 必须包含这个头文件,calloc和free依赖它

// 保持题目要求的函数原型完全不变
char *mystrcat(char *s1, const char *s2);

int main(){
    char string1[] = "test1";
    char string2[] = "test2";
    // 用局部指针接收mystrcat返回的堆内存地址
    char *result = mystrcat(string1, string2);
    
    // 先检查内存分配是否成功(好习惯,避免空指针操作)
    if (result != NULL) {
        printf("Final string: %s\n", result);
        free(result); // 在这里释放内存,完美避开全局变量
    }
    
    return 0;
}

char *mystrcat(char *s1, const char *s2){
    unsigned int len1 = 0;
    // 手动计算s1的长度(保留你原来的逻辑)
    while (*(s1 + len1) != '\0') {
        len1 += 1;
    }
    
    unsigned int len2 = 0;
    // 手动计算s2的长度
    while (*(s2 + len2) != '\0') {
        len2 += 1;
    }
    
    // 在函数内部直接分配内存,用局部指针指向它
    char *newstring = calloc(len1 + len2 + 1, sizeof(char));
    // 检查内存分配是否失败,失败则返回空指针
    if (newstring == NULL) {
        return NULL;
    }
    
    unsigned int i = 0;
    size_t main_count = 0;
    // 复制s1的内容到新内存
    for (; main_count < len1; ++main_count, ++i) {
        *(newstring + main_count) = *(s1 + i);
    }
    
    i = 0;
    // 复制s2的内容到新内存
    for (; main_count < len1 + len2; ++main_count, ++i) {
        *(newstring + main_count) = *(s2 + i);
    }
    
    // 返回指向堆内存的指针,主函数拿到后就能操作它
    return newstring;
}

关键修改点说明

  • 移除全局指针:不再需要全局的newstring,函数内部的局部指针newstring指向堆内存,返回后主函数可以通过这个指针访问内存。
  • 主函数接收返回值:用char *result接收mystrcat的返回值,这样主函数就拥有了堆内存的控制权,能在合适的时候调用free。
  • 添加内存分配检查:calloc可能分配失败(比如内存不足),这时候会返回NULL,我们需要检查这个情况,避免后续操作空指针导致程序崩溃。
  • 保留原有拼接逻辑:你原来手动计算字符串长度、拼接的逻辑完全保留,没有改动,只是调整了内存的管理方式。

为什么这样可行?

calloc分配的内存位于**堆(Heap)区域,而不是函数的栈(Stack)**区域。栈上的局部变量会在函数返回时被销毁,但堆内存会一直存在,直到我们主动调用free释放它。所以mystrcat返回的指针在主函数中仍然有效,完全可以用来访问和释放内存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:22:34