c - 释放函数内部的指针,并在 main 中使用它

标签 c pointers memory-management memory-leaks free

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

char* test() {
    char* s = "Hello World";
    size_t len = strlen(s);
    char* t = malloc(sizeof(char)*(len+1));
    strcpy(t, s);
    free(t);
    return t;
};

int main(void) {
    printf("%s\n", test());
    return 0;
};

我想在函数内部分配和取消分配内存。我测试了这段代码并且有效,但我想知道:

  • 为什么会这样?
  • main 中使用已释放指针的值是好的做法吗?

最佳答案

一旦对指针调用free,它指向的内存就不再有效。尝试使用指向已释放内存触发器的指针 undefined behavior .在这个特殊的案例中,它碰巧起作用了,但不能保证。

如果函数返回分配的内存,调用者有责任释放它:

char* test() {
    char* s = "Hello World";
    size_t len = strlen(s);
    char* t = malloc(sizeof(char)*(len+1));
    strcpy(t, s);
    return t;
};

int main(void) {
    char *t = test();
    printf("%s\n", t);
    free(t);
    return 0;
};

关于c - 释放函数内部的指针,并在 main 中使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69481670/

相关文章:

c - 如何限制PWM占空比值的范围?

c - 如何从函数 A 返回一个数组,然后函数 B 获取这个数组

c - 即使在处理程序中重置,SIGALRM 的信号处理程序也不起作用

c++ - 如何将指针分配给变量?

c - free() 在 c 代码中收集垃圾值,即使在释放后将指针设置为 NULL,代码也不起作用

c++ - 在不复制 block 的情况下在一个 UDP 消息中发送两个数据 block ?

iOS 内存使用量增加直至崩溃

c++ - C C++内存泄漏的原因

c++ - 在 Go 应用程序中使用 C(++) 提高性能

c - 如何检测另一个守护进程是否终止