c - 同一部分中的内存是否总是连续分配?

标签 c

char a_1[512];
int some_variable;
char a_2[512];
main()
{
        ...
}

在上面的程序中,我声明了一些变量,都在代码的 bss 部分。考虑到我牢记对齐问题,我可以确定为这 3 个变量分配的内存将始终 是连续的吗?

最佳答案

Considering that I have kept in mind the alignment issues, can I be sure that the memory allocated for those 3 variables will always be contiguous?

当然不是。阅读 C11标准n1570 ,你不会找到任何关于这一点的保证。

不同的编译器可能会对变量进行不同的排序,特别是当它们是 optimizing 时。 .有些变量甚至可能保留在寄存器中,甚至没有任何内存位置。在实践中,一些编译器遵循源代码的顺序,其他编译器使用一些不同的顺序。

而且您实际上可以自定义(可能会有些痛苦)您的 GCC或者你的 Clang编译器更改该顺序。这确实发生在实践中。例如,最新版本的 GCC 内核可能配置了一些 GCC plugin这可以重新排序变量。使用 GCC 或 Clang,您还可以添加一些 variable attribute更改该顺序。

顺便说一句,如果您需要一些特定的顺序,您可以将字段打包在一些 struct 中,例如代码:

struct {
  char a_1[512];
  int some_variable;
  char a_2[512];
} my_struct;

#define a_1 my_struct.a_1
#define some_variable my_struct.some_variable
#define a_2 my_struct.a_2

顺便说一句,一些旧版本的 GCC 有一个可选的优化 channel ,它重新排序(在某些情况下)struct-s 中的字段(但最近的 GCC 删除了那个优化 channel )。

在评论(应该进入您的问题)中,您提到寻找一些错误。考虑 using the gdb debugger及其 watchpoints (和/或 valgrind )。编译时不要忘记启用所有警告和调试信息(所以 gcc -Wall -Wextra -gGCC )。也许你也想要instrumentation options-fsanitize=address 等等...

当心undefined behavior .

关于c - 同一部分中的内存是否总是连续分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47919255/

相关文章:

c - 为什么在写入使用字符串初始化的 "char *s"时会出现段错误,而不是 "char s[]"?

c - c 中整数的输入验证

c - 将多维静态数组传递给函数

C 函数的参数数量不超过 n

c++ - 如何在我的程序中切换 Debug模式?

python - ctypes 奇怪地处理函数中的可变参数

c - 从类型 ‘struct ZipperNode’ 分配给类型 ‘ZipperTree’ 时的类型不兼容

c - 使用 printf 打印十六进制格式的字符串,结果失真

文件范围内的编译器错误 "error: variably modified ' string'”

c - 在执行时强制使用特定库