字符串存储在哪里,函数返回硬编码的字符串文字?

时间:2017-07-01 02:34:46

标签: c++ c string pointers memory

我在C / C ++代码中看到了这一点:

char * GetName()
{
  return "Aurian";
}

引擎盖下到底发生了什么?在内存中"Aurian"存储的位置使得它在我离开GetName()范围时能够存活,并且我得到一个char *吗?我猜它没有遵循相同的规则,返回一个int。这与

有什么关系?
char * name = "Aurian";

此实施是否依赖?另外,GetName()只会被编译为"Aurian"吗?

This thread似乎暗示某些跳转表可能会用于所有字符串文字,无论如何都要用于GCC。

2 个答案:

答案 0 :(得分:1)

看起来字符串常量存储在数据段的只读部分(以及其他非零初始化静态变量)。检查组件!

我编译了这个

#include<stdio.h>
  char * GetName()
  {
     return "Aurian";
  }
  int main()
  {
      printf("%s", GetName());
      return 0;
  }

,程序集看起来像

    .section    .rodata
    .LC0:
      .string "Aurian"
      .text
      .globl  GetName
      .type   GetName, @function
  GetName:
  .LFB0:
      .cfi_startproc
      pushq   %rbp
      .cfi_def_cfa_offset 16
      .cfi_offset 6, -16
      movq    %rsp, %rbp
      .cfi_def_cfa_register 6
      movl    $.LC0, %eax
      popq    %rbp
      .cfi_def_cfa 7, 8
      ret
      .cfi_endproc
  .LFE0:
      .size   GetName, .-GetName
      .section    .rodata
  .LC1:
      .string "%s"
      .text
      .globl  main
      .type   main, @function
  main:
  .LFB1:
      .cfi_startproc
      pushq   %rbp
      .cfi_def_cfa_offset 16
      .cfi_offset 6, -16
      movq    %rsp, %rbp
      .cfi_def_cfa_register 6
      movl    $0, %eax
      call    GetName
      movq    %rax, %rsi
      movl    $.LC1, %edi
      movl    $0, %eax
      call    printf
      movl    $0, %eax
      popq    %rbp
      .cfi_def_cfa 7, 8
      ret
      .cfi_endproc

答案 1 :(得分:-1)

它用作函数的退出代码,因此它的存储位置取决于操作系统。 C语言没有指定这些低级别的细节。它们因平台而异。

在UNIX风格的系统中,此值将是 wait() waitpid()系统调用的返回值。 在调用这些函数之前,返回代码存储在linux内核的PID条目中。

我们知道

  • 全局变量,静态变量,动态变量都有Heap 存储

  • 函数的指针和参数具有堆栈存储

  • 常量变量存储在代码本身(数据段)

所以基于这些类型,这些变量存储在堆栈中,直到它们从堆栈帧返回

在你的情况下,函数在堆栈调用堆栈帧之后在堆栈上找到空间以隐式返回

当它们被返回时,它们被存储在CPU寄存器中..我们可能会使用两个或更多依赖于操作系统的CPU寄存器