【问题标题】:Is memory allocated for a character array given as actual parameter in a function call?是否为函数调用中作为实际参数给出的字符数组分配了内存?
【发布时间】:2014-12-18 07:05:26
【问题描述】:

我只想知道在函数调用期间作为实际参数给出的字符数组是否存储在一些内存中。 例如:

void printIt(char* ptr) {
......
}

这个函数调用如下:

printIt("hallo");   

这很好用。但是,如果我们传递一个整数并将其作为 int* 接收,它将不起作用,因为我们没有为它分配内存。那么编译器是否会自动为作为参数传递的字符数组分配内存?

【问题讨论】:

  • 您不是在传递一个数组,而是在传递一个指向第一个元素的指针。数组不能传值。
  • 注意"hallo"是一个常量字符串;任何修改它的尝试都会导致未定义的行为。理想情况下,该函数应定义为void printIt(const char *ptr) { … } 或等效项。
  • 某处必须一些内存分配给它。你知道,计算机将数据存储在... 内存中。 所以是的,6 个字节(hallo 和终止 NUL)分配给字符串文字。这与数组在传递给函数时衰减为指针这一事实完全无关。字符串文字是一个数组。单个 int 不是数组。因此,在预期指向char 的指针时传递字符串文字将起作用,而在预期int * 时传递int 将不起作用。
  • 对于 windows (.exe) 文件。该字符串存储在 .data 部分中。不确定它是否需要“内存分配”。我认为只有它的地址被传递给函数。
  • 它肯定需要分配内存,否则不会有地址可以传递。它可能存储在只读数据部分或该函数的堆栈中....不确定实际使用的是哪个

标签: c++ c function arrays


【解决方案1】:

编辑以反映来自 cmets 的输入:

你是在问它在内存中的哪个位置?字符串“hallo”作为字符串文字保存在只读内存中。因此必须传递一个指针(它保存在您的 printit() 方法的本地堆栈空间中),以便该方法可以找到字符串。正如其他人指出的那样,指针指的是字符串的第一个字母,它存储为一个字符数组。您不传递 int 指针的原因是因为您传递了实际值,然后将其本地存储在堆栈中。

【讨论】:

  • 只有指向该字符串的指针被压入堆栈。字符串本身驻留在只读内存中。
  • 我可以理解编译器将它存储在只读部分,就像其他字符串文字一样。但是为什么我们不能传递一个整数 printIt(&10);为什么编译器不将整数作为常量存储在内存中并传递其地址。
  • 感谢您指出 glglgl 我认为这是一个重要的区别。何塞,我认为这只是 int IS 作为值传递并作为局部变量保存在 printit() 方法的堆栈中的一种情况,而正如 glglgl 指出的那样,字符串本身保存在只读内存中,因此必须传递指针。这归结为语言的体系结构,我猜这些决定是与性能相关的。不过,这当然是一个有趣的话题。
【解决方案2】:

通过使用

printIt("hallo");

您将字符串文字“hello”的基地址发送到printIt() 函数,并且您在char* ptr 中接受相同的内容。 ptr 指向"hallo" 的基地址。没有单独的内存分配

在同样的逻辑中,传递int 并将其接收到int * 是行不通的。你需要通过&<some int>

注意:char * ptr 变量本身在函数printIt() 中具有局部作用域。

【讨论】:

    【解决方案3】:

    当你将字符串传递给函数时,指针变量 ptr 将指向h,因为它是字符串的起始位置,它会打印 NULL 字符。 在 32 位系统中会为 ptr 分配 4 个字节,所以它会得到字符串。

    【讨论】:

      猜你喜欢
      • 2017-07-25
      • 2018-07-16
      • 1970-01-01
      • 2016-03-25
      • 2022-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多