如果我让一个函数返回一个指向字符串的指针,比如下面(可能不同的sytnax),那么该字符串在调用函数foo的末尾是否从内存中释放?

void foo(){
    char *string = function();
    // Is string freed at the end of this function?
}

char *function(){
    return "string";
}

我问这个问题是因为我知道如果我把内存设为malloc(),它在foo结束时不会被释放(除非我自己go 释放它).

推荐答案

否."string"的内存是在程序执行期间分配的.

C程序的内存大致可以分为...

  • 代码.
  • 常数,如"string"42.
  • 全局变量和静态变量.
  • 堆栈(函数内为char foo[50]int i)
  • 堆(malloccallocrealloc)

常量、全局变量和静态变量永远不会取消分配.

当函数返回时,堆栈被释放.这就是为什么不应该返回指向堆栈上分配的内存的指针.像intfloat这样的简单值很好,因为值是复制的.

// Don't do this, foo will be deallocated on return.
char *function(){
    char foo[10];
    strcpy(foo, "string");
    return foo;
}

// Don't do this either.
char *function(){
    char foo = 'f';
    return &foo;
}

// Nor this.
int *function(){
    int i = 42;
    return &i;
}

// But this is fine.
char function(){
    char foo = 'f';
    return foo;
}

堆仅在freed时释放.

Where will the Initialized data segment values are stored before run time?Memory Layout of a C Program了解血淋淋的细节.

C++相关问答推荐

为什么这个select()会阻止?

为什么海湾合作委员会在共享对象中的. init_data的虚拟内存地址之前留出一个空白

strftime函数中%s的历史意义是什么?为什么没有记录?

为什么即使在强制转换时,此代码也会溢出?

`#if`条件中是否允许`sizeof`?

是什么让numpy.sum比优化的(自动矢量化的)C循环更快?

错误Cygwin_Except::Open_stackdupfile:正在转储堆栈跟踪是什么?

RawMotion的XInput2错误(具有较高值的XISelectEvents上的BadValue)

如何用c语言修改shadow文件hash部分(编程)?

如何在POSIX-UEFI中获得输入?

强制转换变量以在 struct 中蚕食

循环中的静态变量与块中的变量和循环

C-try 将整数和 struct 数组存储到二进制文件中

某些EAX值的不同调用方的CPUID结果不一致

带有数组指针的 struct 在print_stack()函数中打印随机数

为什么我在我的代码中得到错误和退出代码-1073741819(0xC0000005),但如果我添加了一个不相关的打印语句,它仍然有效?

将数组中的所有元素初始化为 struct 中的相同值

添加/删除链表中的第一个元素

C 语言中霍尔分区的快速排序算法

在 C/C++ 中原子按位与字节的最佳方法?