c语言中char数组的结束位

因为是半路出家学习cpp的,所以经常会对c语言里面的字符数组感到困惑,这次一次性做个总结。

  • 首先,结束位’/0‘只针对字符数组,不针对整型或者其他数组。
  • 其次,指针只能定义字符串char *i = “1”;不能写成char *i = {‘1’};
  • 最后,声明为字符串的字符数组的大小会根据结束位而增加1。例如,char i[] = “12”的大小是3,这种定义类似于char i[] = {‘1’,‘2’, ‘\0’};,其数组元素被隐式地增加了一个‘\0’,对于这个数组而言,其结束位置在数组里面。而char i[1] = “1”; char i[1]; char i[] = {’1‘};三个数组大小都是1,因为第一个第二个声明了数组大小,第三个数组元素已经确定只有一个,对于这三个数组而言,其结束位都在数组内存的外面。
  • 一般而言,字符数组需要显示地声明结束位,例如:char i[] = {‘1’,‘\0’};或者字符数组的size要超过里面元素的个数,例如上述定义为char i[2] = “1”;这样的目的是保证结束位置在数组分配的内存地址里面。
    • char i[1] = ‘1’; 和 char i[2] = ‘1’; 这两个字符数组在定义完之后,其最后一个元素’1‘后面都是结束位’/0‘,只不过一个是在数组分配的内存之外、一个在内部。在程序比较庞大的情况下,由于第一个结束位不在系统分配给数组的内存里面,属于“自由内存”,后面操作系统完全可以把他分配给其他变量,一旦操作系统把这个地址分配给其他变量那么第一个数组便失去了结束位,再利用printf(“s%”, i); 或者其他strcpy之类的函数操作时便会访问到数组之外的内存,直到再恰好碰到下一个结束位。
    • 在查这个资料的时候发现这样一段代码:
      #include <stdio.h>
      
      int main(void)
      {
      	char str1[5];
      	char str2[5];
      	int i;
      	for(i=0;i<5;i++)
      	{
      		str1[i]=i+65;
      		str2[i]=i+97;
      	}
      	printf("%s\n%s\n",str1,str2);
      	return 0;
      }
      
      输出:
      在这里插入图片描述
      以及
      #include <stdio.h>
      int main(void)
      {
      	char str1[16];
      	char str2[16];
      	int i;
      	for(i=0;i<16;i++)
      	{
      		str1[i]=i+65;
      		str2[i]=i+97;
      	}
      	printf("%s\n%s\n",str1,str2);
      	return 0;
      }
      
      其输出为:
      在这里插入图片描述
      说明了两个问题:
    1. 局部变量存储在栈上,栈的地址向下生长,所以str2的地址小于str1,这点可以在第二个代码中看出来——输出str2的时候实际输出是str2+str1,证明str2在低地址。另外从输出顺序来看,数组里面的内容依然是向上生长的。
    2. 查阅资料发现一个事实:连续定义的两个数组,当数组str2的长度小于等于16时,两数组头元素的距离为16;当数组str2的长度超过16但小于等于32时,两数组头元素的距离会变成32;当数组str2的长度超过32但小于等于48时,两数组头元素的距离会变成48;所以,一旦当str2数组大小为16、32、48……时,str1的结束位就会被覆盖掉,输出(%s,str2)时就会连带输出str1。
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值