考虑到内存分为四个部分:数据、堆、堆栈和代码,全局变量、静态变量、常量数据类型、局部变量(在函数中定义和声明)、变量(在主函数中)、指针和动态分配的空间(使用malloc和calloc)存储在内存中?

我认为他们的分配如下:

全局变量-------> data 静态变量------->数据 常量数据类型----->代码 局部变量(在函数中声明和定义)-------->堆栈 主函数-----> heap中声明和定义的变量 指针(例如char *arr, int *arr) ------->堆 动态分配空间(使用malloc和calloc) -------->堆栈

我仅从C的角度引用这些变量。

如果我错了,请指正,因为我是新来C的。


当前回答

我仅从C的角度引用这些变量。

From the perspective of the C language, all that matters is extent, scope, linkage, and access; exactly how items are mapped to different memory segments is up to the individual implementation, and that will vary. The language standard doesn't talk about memory segments at all. Most modern architectures act mostly the same way; block-scope variables and function arguments will be allocated from the stack, file-scope and static variables will be allocated from a data or code segment, dynamic memory will be allocated from a heap, some constant data will be stored in read-only segments, etc.

其他回答

指针(例如char*arr,int *arr) -->堆

不,它们可以在堆栈上,也可以在数据段中。他们可以指向任何地方。

有些问题你答对了,但写问题的人至少在一个问题上骗了你:

global variables -------> data (correct) static variables -------> data (correct) constant data types -----> code and/or data. Consider string literals for a situation when a constant itself would be stored in the data segment, and references to it would be embedded in the code local variables(declared and defined in functions) --------> stack (correct) variables declared and defined in main function -----> heap also stack (the teacher was trying to trick you) pointers(ex: char *arr, int *arr) -------> heap data or stack, depending on the context. C lets you declare a global or a static pointer, in which case the pointer itself would end up in the data segment. dynamically allocated space(using malloc, calloc, realloc) --------> stack heap

值得一提的是,“栈”的正式名称是“自动存储类”。

对于那些未来可能有兴趣了解这些内存段的访问者,我在C语言中写了关于5个内存段的要点:

一些提示:

每当C程序执行时,就会在RAM中分配一些内存用于程序执行。这个内存用于存储频繁执行的代码(二进制数据)、程序变量等。下面的内存段讲的是同样的: 通常有三种变量类型: 局部变量(在C语言中也称为自动变量) 全局变量 静态变量 你可以有全局静态变量或局部静态变量,但上面三个是父类型。

5 C中的内存段:

1. 代码段

The code segment, also referred as the text segment, is the area of memory which contains the frequently executed code. The code segment is often read-only to avoid risk of getting overridden by programming bugs like buffer-overflow, etc. The code segment does not contain program variables like local variable (also called as automatic variables in C), global variables, etc. Based on the C implementation, the code segment can also contain read-only string literals. For example, when you do printf("Hello, world") then string "Hello, world" gets created in the code/text segment. You can verify this using size command in Linux OS. Further reading

数据段

数据段被分为下面两部分,通常位于堆区域的下面,或者在某些实现中位于堆栈之上,但数据段从不位于堆和堆栈区域之间。

2. 未初始化的数据段

This segment is also known as bss. This is the portion of memory which contains: Uninitialized global variables (including pointer variables) Uninitialized constant global variables. Uninitialized local static variables. Any global or static local variable which is not initialized will be stored in the uninitialized data segment For example: global variable int globalVar; or static local variable static int localStatic; will be stored in the uninitialized data segment. If you declare a global variable and initialize it as 0 or NULL then still it would go to uninitialized data segment or bss. Further reading

3.初始化的数据段

This segment stores: Initialized global variables (including pointer variables) Initialized constant global variables. Initialized local static variables. For example: global variable int globalVar = 1; or static local variable static int localStatic = 1; will be stored in initialized data segment. This segment can be further classified into initialized read-only area and initialized read-write area. Initialized constant global variables will go in the initialized read-only area while variables whose values can be modified at runtime will go in the initialized read-write area. The size of this segment is determined by the size of the values in the program's source code, and does not change at run time. Further reading

4. 堆栈段

堆栈段用于存储在函数内部创建的变量(函数可以是主函数或用户定义的函数),如变量 函数的局部变量(包括指针变量) 传递给函数的参数 返回地址 一旦函数执行完成,存储在堆栈中的变量将被删除。 进一步的阅读

5. 堆段

这个段支持动态内存分配。如果程序员想动态分配一些内存,那么在C语言中可以使用malloc、calloc或realloc方法。 例如,当int* prt = malloc(sizeof(int) * 2)时,将在堆中分配8个字节,并返回该位置的内存地址并存储在ptr变量中。ptr变量将在堆栈或数据段上,这取决于它的声明/使用方式。 进一步的阅读

纠正错误的句子

constant data types ----->  code //wrong

本地常量变量----->堆栈

初始化全局常量变量----->数据段

未初始化的全局常量变量-----> BSS

variables declared and defined in main function  ----->  heap //wrong

在主函数-----> stack中声明和定义的变量

pointers(ex:char *arr,int *arr) ------->  heap //wrong

dynamically allocated space(using malloc,calloc) --------> stack //wrong

指针(例如:char *arr,int *arr) ------->该指针变量的大小将在堆栈中。

假设您正在动态分配n字节的内存(使用malloc或calloc),然后使指针变量指向它。现在n个字节的内存在堆中,指针变量需要4个字节(如果64位机器是8个字节),它将在堆栈中存储n个字节的内存块的起始指针。

注意:指针变量可以指向任何段的内存。

int x = 10;
void func()
{
int a = 0;
int *p = &a: //Now its pointing the memory of stack
int *p2 = &x; //Now its pointing the memory of data segment
chat *name = "ashok" //Now its pointing the constant string literal 
                     //which is actually present in text segment.
char *name2 = malloc(10); //Now its pointing memory in heap
...
}

动态分配空间(使用malloc,calloc) -------->堆

关于存储需要记住的一件事是假设规则。编译器不需要把一个变量放在特定的位置——相反,它可以把它放在任何它喜欢的地方,只要编译后的程序按照抽象C机器的规则运行,就像它在抽象C机器中运行一样。这适用于所有存储期限。例如:

a variable that is not accessed all can be eliminated completely - it has no storage... anywhere. Example - see how there is 42 in the generated assembly code but no sign of 404. a variable with automatic storage duration that does not have its address taken need not be stored in memory at all. An example would be a loop variable. a variable that is const or effectively const need not be in memory. Example - the compiler can prove that foo is effectively const and inlines its use into the code. bar has external linkage and the compiler cannot prove that it would not be changed outside the current module, hence it is not inlined. an object allocated with malloc need not reside in memory allocated from heap! Example - notice how the code does not have a call to malloc and neither is the value 42 ever stored in memory, it is kept in a register! thus an object that has been allocated by malloc and the reference is lost without deallocating the object with free need not leak memory... the object allocated by malloc need not be within the heap below the program break (sbrk(0)) on Unixen...