zoukankan      html  css  js  c++  java
  • 栈上数组,做了什么事?

    考虑 char tmp[7] = "abcd";  做了什么事?
    1、按道理,堆栈指针需要在栈顶挪出7个字节,但是为了字节对齐,栈顶指针会挪出8个字节,最高地址的一个字节不使用,是cc,注意:栈的使用,地址是减小的。
    2、tmp就是栈顶指针的别名,是个常量,不能修改指向。
    3、从栈顶向高地址拷贝a,b,c,d,, 5个字节,是"abcd"结尾隐含的字节,数组申请了7个字节,剩余的两个字节补充为, 第8个字节为cc,没有初始化。
    4、数组可以不定义长度,这种情况必须定义内容,由右边的内容确定数组的长度。char tmp[]="abcd"; sizeof(tmp)的长度就是5。如果不定义长度,并且不定义内容,编译报错 数组名 unknown size
    5、数组定义长度,不定义内容,数组的内容不初始化,取值为cc,连起来就是中文的烫字。
    6、数组定义长度,同时定义内容,内容长度小于数组长度,缺少的部分使用初始化,注意:如果数组定义的长度不是4的倍数,为了对齐,还会多挪出一些字节,这些字节不使用,为cc。
    7、数组定义长度,同时定义内容,内容长度大于数组长度,编译报错:数组名 array bounds overflow,数组溢出。特别注意:char tmp[4]="abcd"; 也会溢出,因为"abcd"是文本字符串,隐含一个,实际长度是5。
    8、特别注意:定义的数组长度,除了包含实际的内容,还要至少多一个字节,用于保存。否则,strlen,strcpy会出现问题。如下:
    char tmp[4];
    strncpy(tmp,"abcd",4);
    int size = strlen(tmp); //size取值是不确定的,直到找到
    因此,IP地址的数组,应该是 char ip[16];或者ip[sizeof("255.255.255.255")],sizeof("255.255.255.255")的值不是15,而是16
  • 相关阅读:
    二维凸包
    luogu_P1287 盒子与球
    luogu_P1993 小K的农场
    luogu_P1712 [NOI2016]区间
    luogu_P2444 [POI2000]病毒
    luogu_P2154 [SDOI2009]虔诚的墓主人
    20191005-T3-U91353 放射性
    编译原理 笔记2 词法分析
    DFA到等价正则表达式的转化
    软件分析笔记10 Soundiness
  • 原文地址:https://www.cnblogs.com/nzbbody/p/4391223.html
Copyright © 2011-2022 走看看