相关疑难解决方法(0)

"编译时分配的内存"究竟意味着什么?

在C和C++等编程语言中,人们经常提到静态和动态内存分配.我理解这个概念,但短语"所有内存在编译期间被分配(保留)"总是让我感到困惑.

据我所知,编译将高级C/C++代码转换为机器语言并输出可执行文件.如何在编译文件中"分配"内存?是不是内存总是在RAM中分配所有虚拟内存管理的东西?

根据定义,内存分配不是运行时概念吗?

如果我在我的C/C++代码中创建一个1KB静态分配的变量,那么这会增加可执行文件的大小吗?

这是在"静态分配"标题下使用该短语的页面之一.

回归基础:记忆分配,走下历史

c c++ memory memory-management terminology

149
推荐指数
8
解决办法
3万
查看次数

在内存中我的变量存储在C中?

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

我认为他们将分配如下:

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

我只是从C的角度来指这些变量.

如果我错了,请纠正我,因为我是C的新手.

c memory types memory-management

134
推荐指数
5
解决办法
20万
查看次数

131
推荐指数
4
解决办法
12万
查看次数

静态内存分配和动态内存分配之间的区别

我想知道静态内存分配和动态内存分配有什么区别?

你能用任何一个例子解释一下吗?

c memory memory-management dynamic-memory-allocation static-memory-allocation

80
推荐指数
2
解决办法
29万
查看次数

是否可以指示C不对全局数组进行零初始化?

我正在编写一个嵌入式应用程序,几乎所有的RAM都被全局字节数组使用.当我的固件启动时,它会通过用零覆盖RAM中的整个BSS部分来启动,这在我的情况下是完全没有必要的.

有没有什么方法可以指示编译器不需要对某些数组进行零初始化?我知道这也可以通过将它们声明为指针并使用malloc()来解决,但有几个原因我想避免这种情况.

c embedded gcc c99

15
推荐指数
2
解决办法
9445
查看次数

哪个数据段是C字符串存储?

我想知道char s[] = "hello"和之间的区别是什么char *s = "hello".

看完这个这个,我还没有在这个问题上非常清楚.


据我所知,内存中有五个数据段,Text,BSS,Data,Stack和Heap.

根据我的理解,

在以下情况下char s[] = "hello":

  1. "hello" 在文本中.
  2. s 如果是全局变量,则在Data中;如果是局部变量,则在Stack中.

  3. 我们还有一个存储"hello"位置的副本s,因此我们可以修改此字符串的值s.

在以下情况下char *s = "hello":

  1. "hello" 在文本中.
  2. s 如果是全局变量,则在Data中;如果是局部变量,则在Stack中.
  3. s只是指向"hello"Text并且我们没有它的副本,因此通过此指针修改字符串的值应该导致"Segmentation Fault".

我对吗?

c string char

12
推荐指数
1
解决办法
2378
查看次数

全局变量0初始化惩罚

这是一个非常简单的问题:

0初始化全局变量和静态变量是否在运行时有任何性能损失(尽管非常小)?

c++

10
推荐指数
1
解决办法
522
查看次数

在C中,为什么我初始化为0 int变量被"nm"报告为未初始化?

我有以下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以外的其他东西初始化"之间的区别?

c variables initialization nm

9
推荐指数
1
解决办法
401
查看次数

我的链接器文件中的内存属性'p'是什么?

在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'一般意味着什么?

c ld linker-scripts

8
推荐指数
1
解决办法
500
查看次数

内存中的 BSS 与 DATA 段

//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)

c memory embedded

4
推荐指数
1
解决办法
2970
查看次数

.bss部分的意义

.bss部分的意义是什么,因为我们已经有了单独的数据部分.它对数据部分有什么好处?在.bss部分中,所有变量都将初始化为零?如果我像这样声明变量 - int a = 0; 所以这个变量将在哪个部分?

c memory-management

0
推荐指数
1
解决办法
56
查看次数