C中字符/数组长度内存分配的大小,

C中字符/数组长度内存分配的大小,,c,C,有人能告诉我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]); // -10792

有人能告诉我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

您没有正确打印地址:地址不是
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]

内存分配有点棘手,但比您想象的要简单。顾名思义,它是对数据的使用和选择,以优化程序功能和速度。基本上,内存分配是C/C++等语言的一种“特权”,它允许程序员只使用所需的数据,为其他计算机功能释放内存

一些关于记忆的好信息

  • 内存以“字节”表示,这些字节是8位的数据“组”
  • “位”是0或1的值
可变尺寸:

  • 字符:1字节
  • 整数:4字节
  • 双精度:8字节
当相邻元素的类型相同(例如,一个字符数组)时,它们的地址会有一个差,按内存大小的值递增/递减。 由于char变量的大小为1字节,相邻元素的地址相差1

字符地址:1204120512061207。。。(1字节)


内部地址:12041208121216126。。。(4字节)

foo
是一个字符数组,因此与任何其他数组大小相同,因为它本质上只是一个指针。“字符变量的大小是多少?2或4?”它是1@apokryfos,数组不是指针。根据元素类型和容量的不同,它们有不同的大小。@好吧,这里面没有过多的类型转换answer@Oka这是必需的<代码>%p
需要
void*
,因此传递
int*
被认为是UB。啊,这是安全提升指向
void*
的任何指针的例外。猜这和瓦拉格有关?有趣。@Oka尽管任何指针都可以在需要
void*
的上下文中使用(调用带有
void*
参数的函数,对
void*
变量的赋值)
printf
有一个可变长度的参数列表。因此,默认情况下,指针不会被转换。