随笔 - 576  文章 - 0  评论 - 62  阅读 - 219万

栈上数组,做了什么事?

考虑 char tmp[7] = "abcd";  做了什么事?
1、按道理,堆栈指针需要在栈顶挪出7个字节,但是为了字节对齐,栈顶指针会挪出8个字节,最高地址的一个字节不使用,是cc,注意:栈的使用,地址是减小的。
2、tmp就是栈顶指针的别名,是个常量,不能修改指向。
3、从栈顶向高地址拷贝a,b,c,d,\0, 5个字节,\0是"abcd"结尾隐含的字节,数组申请了7个字节,剩余的两个字节补充为\0, 第8个字节为cc,没有初始化。
4、数组可以不定义长度,这种情况必须定义内容,由右边的内容确定数组的长度。char tmp[]="abcd"; sizeof(tmp)的长度就是5。如果不定义长度,并且不定义内容,编译报错 数组名 unknown size
5、数组定义长度,不定义内容,数组的内容不初始化,取值为cc,连起来就是中文的烫字。
6、数组定义长度,同时定义内容,内容长度小于数组长度,缺少的部分使用\0初始化,注意:如果数组定义的长度不是4的倍数,为了对齐,还会多挪出一些字节,这些字节不使用,为cc。
7、数组定义长度,同时定义内容,内容长度大于数组长度,编译报错:数组名 array bounds overflow,数组溢出。特别注意:char tmp[4]="abcd"; 也会溢出,因为"abcd"是文本字符串,隐含一个\0,实际长度是5。
8、特别注意:定义的数组长度,除了包含实际的内容,还要至少多一个字节,用于保存\0。否则,strlen,strcpy会出现问题。如下:
char tmp[4];
strncpy(tmp,"abcd",4);
int size = strlen(tmp); //size取值是不确定的,直到找到\0
因此,IP地址的数组,应该是 char ip[16];或者ip[sizeof("255.255.255.255")],sizeof("255.255.255.255")的值不是15,而是16
posted on   Andy Niu  阅读(1092)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
历史上的今天:
2014-04-03 【M28】智能指针
2014-04-03 【M30】代理类
2014-04-03 C++数组
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示