您的位置:首页 > 其它

sizeof() 计算字符型指针数组元素个数时要注意

2016-11-04 17:22 232 查看

前言

一直以来,计算一个变量所占用内存的字节数,或者计算一个数组的元素个数,习惯使用sizeof() 这个关键字, 这个关键字有点特殊,还带有个括号。其实不带括号也是可以的,用空格代替,但是审美上,就没那么美观了。

问题再现

#include "stdio.h"
int main(int argc, char *argv)
{
const char *acStr[3]= {"111","222","333"};
int i;

for(i=0;i<sizeof(acStr);i++)
{
printf("%s.\n",acStr[i]);
}

return 0;
}


初看没问题,可是一旦运行,就导致内存越界溢出了,因为此时sizeof(acStr) 并不是等于3,而是12(32位机器上),博主的示例代码,运行之后很容易从打印信息中看出来端倪,是sizeof(acStr)出现了问题,但是当时博主实际情况并不这么明显,在调用函数gethostbyname()时,出现错误,继而出现段错误,后面想了很久并做了调试才知道,原来sizeof(acStr) 并不是我想要的结果。

总结

char *acStr[3] 和 char aChar[3]

在使用sizeof()计算数组元素个数时,很容易在主观上认为是相等的,可实际上char acStr[3] 的 char 是描述其数组元素的类型,即指针类型,而指针类型在32位机器上是占用4个字节,这也就是为什么sizeof(acStr)会等于12的原因了, 博主在这里描述这个坑,一来警醒自己,二来也提醒读者。

同时计算数组元素个数,在使用sizeof时,一个好的习惯如下:

sizeof(数组名)/sizeof(数组元素的类型)

本博文的示例如下:

sizeof(acStr)/sizeof(char *)

自己一时的偷懒,习惯在计算字符型数组元素个数时使用sizeof(数组名),其实这里存在隐患,把数组所占用字节数当作数组元素个数了,因为此时的数组元素类型是char型,恰巧占用一个字节。一旦定义多字节的数组时,就容易习惯性的按照以前的计算方法进行计算,很容易导致错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sizeof 指针 内存