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型,恰巧占用一个字节。一旦定义多字节的数组时,就容易习惯性的按照以前的计算方法进行计算,很容易导致错误。
相关文章推荐
- 你必须知道的指针基础-4.sizeof计算数组长度与strcpy的安全性问题
- C和指针之数组名和&数组名和&首元素以及sizeof(数组名)和sizeof(数组名作为参数)区别
- 计算结构体、数组、指针的sizeof
- 谭浩强4版 8.15题 指针指向数组元素,相对位置计算
- sizeof - 指针,数组,变量,结构体字节对齐-计算
- 关键字(sizeof),数组,指针,字符串的注意点
- 一维数组、二维数组、字符数组、指针 相关的 sizeof 计算
- sizeof 计算指针和数组
- C语言计算数组的元素和(帮助理解指针)
- double*等指针类型所占字节数 float* long* int* short* 要求用sizeof 运算符计算C++中char*
- 数组与指针内存比较注意
- sizeof运算符计算数组长度
- 数组和指针 计算内存容量
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- 计算数组中元素出现的百分比
- 【转】字符数组,字符指针,Sizeof总结
- 指针数组与sizeof
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- 字符数组,字符指针,Sizeof总结