c-我必须在函数中malloc一个返回的字符串



下面的程序将按预期在屏幕上打印"Hello\nWorld\n"('\n'=行向下)。但实际上,正如我所了解到的,这里的一些事情并没有按预期完成。"Hello"one_answers"world"字符串是在函数内定义的(因此是本地的,它们的内存在函数作用域的末尾释放,对吧?)。实际上,我们并没有像预期的那样为它们做malloc(以保存作用域之后的内存)。所以,当a()完成时,内存堆栈不是向上移动了吗?它的光标和"世界"将被放在内存中"你好"所在的位置?(看起来这里没有发生这种情况,我不明白为什么,因此,如果内存块实际上被保存了,并且在作用域之后没有返回,为什么我通常需要做这个malloc?)

谢谢。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *a()
{
    char *str1 = "Hello";
    return str1;
}
char *b()
{
    char *str2 = "World";
    return str2;
}
int main()
{
    char *main_str1 = a();
    char *main_str2 = b();
    puts(main_str1);
    puts(main_str2);
    return 0;
}

edit:所以你实际上说的是,我的"hello"字符串在内存中占据了恒定的位置,即使它在函数中,如果我有它的地址,我也可以从任何我想要的地方读取它(所以它的定义就像一个malloc,但你不能释放它)-对吧?

常量字符串不会在堆栈上分配。堆栈上只分配了指针。从a()b()返回的指针指向可执行内存的某个文字常量部分。关于这个主题的另一个问题

在这种情况下,所有操作都有效,因为字符串文字是在所有程序生命周期可用的内存数据中分配的
您的代码相当于(产生相同的结果,我的意思是):

char *a()
{
    return "Hello";
}

此代码不起作用

char* a()
{
  char array[6];
  strcpy(array,"Hello");
  return array;
}

因为array[]是在堆栈上创建的,并且在函数返回

时被销毁

字符串文字(用"quotes"定义的字符串)在编译时在程序的内存空间中静态创建。当使用char *str1 = "Hello";时,并不像使用malloc调用那样在运行时创建新内存。

C并没有强制编译器按照OP的建议移动堆栈上的内存,这就是为什么观察到的行为没有按预期失败的原因。

编译器模型和优化可以使程序(如具有未定义行为(UB)的OP)明显地在没有损坏内存或seg错误等副作用的情况下工作。另一个编译器也可能编译具有非常不同结果的相同代码。

分配内存的版本如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *a() {
  return strdup("Hello"); // combo strlen, malloc and memcpy
}
char *b() {
  return strdup("World");
}
int main() {
  char *main_str1 = a();
  char *main_str2 = b();
  puts(main_str1);
  puts(main_str2);
  free(main_str1);
  free(main_str2);
  return 0;
}

相关内容

  • 没有找到相关文章

最新更新