[求助]char类型的数组在栈内存中的分配问题,请教一下大家

andymiaonuaa 2014-07-29 11:41:18

#include <stdio.h>

int main()
{
char a[64];
char b[64];

printf("a[63] = %d \na[0] = %d \nb[63] = %d \nb[0] = %d\n", &a[63], a, &b[63], b);
return 0;
}





按照入栈的顺序,a先入,b后入
但是为什么a[0]和b[63]之间相差了几个字节呢?应该也不存在内存对齐的问题啊?
另外用gcc编译也是这样的。
不太理解为何之间隔了几个字节。。。。
而如果是结构体中的这样两个char数组,是不会有补充字节的
...全文
318 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
andymiaonuaa 2014-07-31
  • 打赏
  • 举报
回复
引用 4 楼 lin5161678 的回复:
和入栈完全没关系 你这里定义的2个数组 唯一可以确定是只有 数组a 的内存绝对不会和 数组b 的内存发生任何形式的重叠 除此之外的包括 a在b之前 a在b之后 a和b直接有没有填充 a和b之间填充多少字节 都是不做任何保证 不做任何约束的 另外 内存对齐只是填充字节的理由之一 填充字节还有许多其他原由 包括不限于 检查是否读写越界的保护字节 为其他变量准备的字节 编译器作者的恶趣味 [就是老子高兴] ......
回答的深入浅出!应该是最对我胃口的答案了,感谢!
andymiaonuaa 2014-07-31
  • 打赏
  • 举报
回复
引用 3 楼 henry3695 的回复:


#include <stdio.h>

void abc(int a,int b,int c)
{
	printf("a=0x%p\nb=0x%p\nc=0x%p\n",&a,&b,&c);
}
int main()
{
// 	char a[64];
// 	char b[64];
// 
// 	printf("a[63] = %d \na[0]  = %d  \nb[63] = %d  \nb[0]  = %d\n", &a[63], a, &b[63], b);


	int a,b,c;
	abc(a,b,c);
	return 0;
}

//楼主那个是在栈区分配内存,这个分配是随机的吧,就是随计算机系统来分配的,看到哪里有空的内存,他就给你分配一块
//所以两个数组不一定相邻的,
//看下我写的例子,a,b,c的地址就是相邻的,楼主可以这样思考问题,必成大牛
看来函数内部的变量,只有入参是有入栈和出栈的操作的。 基础太薄弱,还有很多要学的,十分感谢!
andymiaonuaa 2014-07-31
  • 打赏
  • 举报
回复
引用 1 楼 mujiok2003 的回复:
引用
按照入栈的顺序,a先入,b后入 但是为什么a[0]和b[63]之间相差了几个字节呢?应该也不存在内存对齐的问题啊?
这里没有入栈出栈哦。 相差多少都是可以的, 编译器有这个自由。 输出地址要用%p
学习了,看来以前我一直在概念上有错误。 为了理解这个小程序,我用vc把他弄成汇编的看了下,确实这种局部变量不是push和pop操作,而是系统直接在栈内申请内存。
Mr丶Lennie 2014-07-30
  • 打赏
  • 举报
回复
输出地址应该用%p
下图是我运行程序输出的结果

a[63] 与 a[0] 相差3F转换成十进制也就是63,char是占用1个字节,而你数组长度也就是64个字节,所以并没有什么问题
阿呆_ 2014-07-30
  • 打赏
  • 举报
回复
怎么看都是输出从a[63]开始连续4字节中位置存放的一个int而不是输出&a[63]地址。 输出的内容和连续不连续有一毛钱关系吗?
鼻涕虫de皮皮 2014-07-30
  • 打赏
  • 举报
回复
学习了。。。。。
majia2011 2014-07-30
  • 打赏
  • 举报
回复
换成release版本的,就不会有疑问了,呵呵呵 别问细节,太基础了,要讲的东西太多
lin5161678 2014-07-30
  • 打赏
  • 举报
回复
和入栈完全没关系 你这里定义的2个数组 唯一可以确定是只有 数组a 的内存绝对不会和 数组b 的内存发生任何形式的重叠 除此之外的包括 a在b之前 a在b之后 a和b直接有没有填充 a和b之间填充多少字节 都是不做任何保证 不做任何约束的 另外 内存对齐只是填充字节的理由之一 填充字节还有许多其他原由 包括不限于 检查是否读写越界的保护字节 为其他变量准备的字节 编译器作者的恶趣味 [就是老子高兴] ......
我看你有戏 2014-07-30
  • 打赏
  • 举报
回复


#include <stdio.h>

void abc(int a,int b,int c)
{
	printf("a=0x%p\nb=0x%p\nc=0x%p\n",&a,&b,&c);
}
int main()
{
// 	char a[64];
// 	char b[64];
// 
// 	printf("a[63] = %d \na[0]  = %d  \nb[63] = %d  \nb[0]  = %d\n", &a[63], a, &b[63], b);


	int a,b,c;
	abc(a,b,c);
	return 0;
}

//楼主那个是在栈区分配内存,这个分配是随机的吧,就是随计算机系统来分配的,看到哪里有空的内存,他就给你分配一块
//所以两个数组不一定相邻的,
//看下我写的例子,a,b,c的地址就是相邻的,楼主可以这样思考问题,必成大牛
mujiok2003 2014-07-30
  • 打赏
  • 举报
回复
入栈的顺序也是不确定的。
mujiok2003 2014-07-30
  • 打赏
  • 举报
回复
引用
按照入栈的顺序,a先入,b后入 但是为什么a[0]和b[63]之间相差了几个字节呢?应该也不存在内存对齐的问题啊?
这里没有入栈出栈哦。 相差多少都是可以的, 编译器有这个自由。 输出地址要用%p

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧