在C和C++等编程语言中,人们经常提到静态和动态内存分配.我理解这个概念,但短语"所有内存在编译期间被分配(保留)"总是让我感到困惑.
据我所知,编译将高级C/C++代码转换为机器语言并输出可执行文件.如何在编译文件中"分配"内存?是不是内存总是在RAM中分配所有虚拟内存管理的东西?
根据定义,内存分配不是运行时概念吗?
如果我在我的C/C++代码中创建一个1KB静态分配的变量,那么这会增加可执行文件的大小吗?
这是在"静态分配"标题下使用该短语的页面之一.
通过考虑将内存分为四个部分:数据,堆,堆栈和代码,全局变量,静态变量,常量数据类型,局部变量(在函数中定义和声明),变量(在main函数中),指针,并动态分配空间(使用malloc和calloc)存储在内存中?
我认为他们将分配如下:
char *arr,int *arr)------->堆我只是从C的角度来指这些变量.
如果我错了,请纠正我,因为我是C的新手.
我想知道静态内存分配和动态内存分配有什么区别?
你能用任何一个例子解释一下吗?
c memory memory-management dynamic-memory-allocation static-memory-allocation
我正在编写一个嵌入式应用程序,几乎所有的RAM都被全局字节数组使用.当我的固件启动时,它会通过用零覆盖RAM中的整个BSS部分来启动,这在我的情况下是完全没有必要的.
有没有什么方法可以指示编译器不需要对某些数组进行零初始化?我知道这也可以通过将它们声明为指针并使用malloc()来解决,但有几个原因我想避免这种情况.
我想知道char s[] = "hello"和之间的区别是什么char *s = "hello".
据我所知,内存中有五个数据段,Text,BSS,Data,Stack和Heap.
根据我的理解,
在以下情况下char s[] = "hello":
"hello" 在文本中.s 如果是全局变量,则在Data中;如果是局部变量,则在Stack中.
我们还有一个存储"hello"位置的副本s,因此我们可以修改此字符串的值s.
在以下情况下char *s = "hello":
"hello" 在文本中.s 如果是全局变量,则在Data中;如果是局部变量,则在Stack中.s只是指向"hello"Text并且我们没有它的副本,因此通过此指针修改字符串的值应该导致"Segmentation Fault".我对吗?
我有以下C代码:
//declared at the beginning of the CAStar.c file:
int TERRAIN_PASSABLE = 1;
int TERRAIN_IMPASSABLE = 0;
int TERRAIN_SOME_WHAT_PASSABLE = 2;
Run Code Online (Sandbox Code Playgroud)
我注意到,对于这些变量中的任何一个,如果它们具有非零值,则"nm"命令将它们报告为类型"D"(初始化):
_TERRAIN_PASSABLE |00000008| D |
_TERRAIN_SOME_WHAT_PASSABLE|00000004| D |
Run Code Online (Sandbox Code Playgroud)
但是,初始化为0的那些报告为"B"(未初始化):
_TERRAIN_IMPASSABLE |00000000| B |
Run Code Online (Sandbox Code Playgroud)
为什么"初始化为0"和"用0以外的其他东西初始化"之间的区别?
在GCC中,MEMORY命令描述目标中内存块的位置和大小.必须以这种方式使用该命令.
MEMORY
{
name [(attr)] : ORIGIN = origin, LENGTH = len
...
}
Run Code Online (Sandbox Code Playgroud)
现在,我有一个链接器使用的链接器文件(基于GCC的tricore微控制器链接器,tricore-ld)以这种方式定义RAM内存部分:
MEMORY
{
ram (w!xp): org = 0x70000000, len = 32k
...
}
Run Code Online (Sandbox Code Playgroud)
你能解释(p!x p)中'p'的含义吗?'p'一般意味着什么?
//Global space
int A;
int B = 0;
int C = 0x01;
static int D;
static int E = 0;
static int F = 0x01;
void foo()
{
static int G;
static int H = 0;
static int I = 0x01;
}
Run Code Online (Sandbox Code Playgroud)
我的理解是,所有未显式初始化或初始化为 0 的全局变量和静态变量都将进入 BSS 部分。所有使用 0 以外的值初始化的全局变量和静态变量都将进入 DATA 部分。我对吗?
在这种情况下,以下内容是正确的。
A -- BSS (No Explicit init)
B -- BSS (init to 0)
C -- DATA (!= 0)
D -- BSS
E -- BSS
F -- DATA
G -- …Run Code Online (Sandbox Code Playgroud) .bss部分的意义是什么,因为我们已经有了单独的数据部分.它对数据部分有什么好处?在.bss部分中,所有变量都将初始化为零?如果我像这样声明变量 - int a = 0; 所以这个变量将在哪个部分?