sizeof字符串/数组长度C中的内存分配,

时间:2016-09-26 00:05:01

标签: c

有人可以告诉我c中的内存分配吗? char变量的大小是多少? 2还是4? 为什么数组中2个相邻char元素之间的地址值差异仅为1?

char foo [] = {'a', 'b'};
printf ("This is the Address of val1 %d \n", &foo[1]);           // -1079295441
printf ("This is the Address of val2 %d \n", &foo[2]);           // -1079295440
printf ("The size of each array member is %d \n", sizeof(foo));  // 2

2 个答案:

答案 0 :(得分:3)

您无法正确打印地址:地址不是int,因此您无法使用%d进行打印。改为使用%p(代表“指针”),并将地址转换为void*进行打印:

printf ("This is the Address of val1 %p\n", (void*)&foo[1]);

现在你的程序产生了这个或类似的输出:

This is the Address of val1 0xffbd2fcf 
This is the Address of val2 0xffbd2fd0 
The size of each array member is 2

两个指针由1关闭,这是一个char的大小。整个数组的大小为2。如果要打印单个元素的大小,请使用foo[0]

答案 1 :(得分:0)

内存分配有些棘手,但是比您想象的要容易。顾名思义,它是用来优化程序功能和速度的数据使用和选择。基本上,内存分配是C / C ++等语言的“特权”,它允许程序员仅使用所需数量的数据,从而为其他计算机功能释放了内存。

一些关于内存的好信息...

  • 内存以“字节”为单位,它们是8位“组”的数据。
  • “位”是0或1的值。

可变尺寸:

  • 字符:1个字节
  • 整数:4个字节
  • 双精度:8个字节

当相邻元素具有相同类型(例如,一个字符数组)时,它们的地址差将以内存大小的值递增/递减。 由于char变量的大小为1个字节,因此相邻元素的地址将相差1。

例如:字符地址:1204、1205、1206、1207 ...(1个字节)

int地址:1204、1208、1212、1216 ...(4个字节)