繁体   English   中英

在 C 编程中,如果变量被声明为全局变量但随后在 main 中被 malloced 存储在哪里?

[英]In C programming, where is a variable stored if it is declared as a global variable but is then malloced in main?

我知道全局变量存储在静态数据中,使用 malloc 的东西存储在堆上。 这个案子似乎自相矛盾。 它会被存放在哪里?

前任:

char* example;

int main(){
    example = malloc(1);
}

编辑:谢谢大家,我想我现在明白了!

没有矛盾。

在文件范围内定义的变量通常位于程序的数据区中,而动态分配的内存位于堆中。 在您的示例中,变量example位于数据段中,而它指向的内存(在调用malloc )位于堆中。

当你在C程序中声明一个全局变量时,它在执行时确实是存放在进程的数据段中的。 现在给出你的例子,你会有这样的事情:

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

int *num; // or int *num = NULL;

int main(int argc, char *argv[]){
  num = malloc(sizeof(int));
  *num = 10;
  return 0;
}

在此示例中,数据段中存在的是编译器为名为 num 的 int * 保留的空间。 当执行 malloc 时,堆中的内存确实为 int 保留,并且该内存的地址被返回并存储在 num 中。

因此 num 确实存在于数据段中,但实际数据(在这种情况下为 10)存储在 num 指向的地址中,该地址位于堆中。 我尽我所能尽可能清楚地解释它,但请随时要求任何澄清。

干得好:

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

struct really_big_data {
  char data[2000];
  size_t used;
};

struct really_big_data
    global_data; /* all space allocated in program static at program startup */
struct really_big_data
    *global_ptr; /* space for one pointer in program static */

int main() {
  global_ptr = calloc(1, sizeof *global_ptr); /* space on heap allocated at runtime */

  free(global_ptr);
  return 0;
}

的空间(很可能的8个字节或4个字节)为address ,通常是在可执行文件中的数据段。 你用malloc分配的字节将在进程的堆上。

没有矛盾,因为“全局”更多是词汇考虑,不一定是您的问题提出的空间考虑。 具有全局作用域(即文件作用域)的变量意味着任何代码块都可以引用它。 例外情况是,如果您有一个同名的局部作用域变量,在这种情况下,该块将无法寻址全局作用域变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM