C语言中的字符大小/数组长度和内存分配问题

3

请问有人能告诉我c语言中的内存分配吗? char类型变量的大小是多少?2还是4? 为什么数组中相邻的两个字符元素之间地址值只相差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

foo是一个字符数组,因此与任何其他数组具有相同的大小,因为它本质上只是一个指针。 - apokryfos
“char变量的大小是多少?2还是4?” 它是1。 - samgak
1
@apokryfos,数组并不是指针。它们的大小取决于它们的元素类型和容量。 - John Bollinger
2个回答

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。整个数组的大小为2。如果要打印单个元素的大小,请使用foo [0]


@Oka 这个答案中没有过多的强制类型转换。 - M.M
1
@Oka 这是必需的。%p 需要 void*,因此传递 int* 被认为是未定义行为。 - Sergey Kalinichenko
啊,这是对任何指向void *的指针进行安全提升的一个例外。猜测这与可变参数有关?有趣。 - Oka
2
@Oka 虽然任何指针都可以在需要 void* 的上下文中使用(调用带有 void* 参数的函数,分配给 void* 变量),但 printf 具有可变长度的参数列表。因此,默认情况下指针不会转换。 - Sergey Kalinichenko

0

内存分配有点棘手,但比你想象的要容易。正如其名称所示,它是优化程序功能和速度的数据使用和选择。基本上,内存分配是语言(例如C / C ++)的“福利”,允许程序员只使用所需的精确数据量,释放内存以用于其他计算机功能。

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

  • 内存以“字节”为单位,这些是数据的8位“组”。
  • “位”是一个值,可以为0或1。

变量大小:

  • Char:1字节
  • Int:4字节
  • double:8字节

当相邻元素具有相同的类型(例如,字符数组),它们的地址之间的差异会按照内存大小的值递增/递减。 由于char变量的大小为1个字节,相邻元素的地址将不同1个字节。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接