c - 基本C程序中的内存分配和未使用字节

标签 c

我对基本 C 程序的内存分配有疑问。

#include <stdio.h>

int main()
{
    int  iarray[3];
    char carray[3];
    
    printf("%p\n", &iarray); // b8
    printf("%p\n", &iarray+1); // c4
    printf("%p\n", &carray); // c5
    
    return 0;
}

给出上面的代码,你可以看到 &iarray+1&carray 有一个字节的差异,我不确定是为了哪个目的或其中的内容,为什么编译器会在两个数组之间分配一个未使用的字节?

我想也许它用来知道数组的大小,但我知道 sizeof 是一个编译时函数,它知道大小而不分配实际内存,所以存储数组没有用大小

注意:输出可以在每个printf的注释中看到。

b8
c4
c5

Playground : https://onlinegdb.com/cTdzccpDvI

谢谢。

最佳答案

编译器可以自由地以他们认为合适的方式在内存中安排变量。通常,它们将被放置在其值是变量大小的倍数的内存偏移处,例如,一个 4 字节的 intint 数组将从一个地址开始,该地址是4 的倍数。

在这种情况下,您有一个 int 数组,起始地址是 4 的倍数,后跟一个未使用的字节,然后是一个大小为 char 的数组3. 理论上,intlong 可以紧跟在内存中的 char 数组之后,如果它被定义为下一个可用地址是一个倍数共 8 个。

关于c - 基本C程序中的内存分配和未使用字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70894455/

相关文章:

c - 打印字符串的字母频率

c++ - 未定义/未指定?

c - C中的交替按位连接

比较操作被完全忽略

c - C中的简单计算器,只有乘法运算符不起作用

托管实现中的 sizeof(int) 是否可以为 1?

c - 放弃对 C 的 SYN 攻击

复数 (complex.h) 和明显的精度滞后

c - 优化时,在现代编译器中使用 `register` 关键字是否无用?

c - 数组作为结构的一部分