c++数组大小的奇怪行为
Strange behavior of C++ array size
我正在写一个c++函数来计算c++中c类型数组的大小
在使用这两个不同的代码时,我注意到一个非常奇怪的行为:
代码1:int sz = sizeof array / sizeof *array;
代码2:int array_size(const int *pointer)
{ int count=0;
if(pointer)
while(*pointer) {
count++;
pointer++;
}
return count;
}
当我在数组上应用这两个方法时,它给出了非常奇怪的行为:
示例1:
int array[10] = {31,24,65,32,14,5};// defined to be size 10 but init with size 6
代码1会给我size = 10,但代码2会给我size = 6,当我打印出*指针指向的元素时,它会给我正确的数组元素:
31 24 65 32 14 5
示例2
int array[] = {31,24,65,32,14,5}; // no declared size but init with 6
代码1给我的大小是6,代码2给我的大小是12,当我打印代码2中*指针指向的元素时,它给了我:
31 24 65 32 14 5 -802013403 -150942493 1461458784 32767 -1918962231 32767
是不正确的,那么是什么问题导致了这种行为呢?这些数字是什么?
谢谢你的回答
这个数组有10个元素,不管你如何初始化它:
int array[10] = {31,24,65,32,14,5};
但是初始化将前6个元素设置为某些值,其余元素设置为0
。它相当于这样:
int array[10] = {31,24,65,32,14,5,0,0,0,0};
使用sizeof
的第一次计算使用数组的实际大小(其长度乘以int
的大小),而第二次计算则计数元素直到找到0
。因此,它不计算数组的长度,而是计算数组中第一个非零序列的长度。
注意,第二个方法只有在数组中有一个值为0
的元素时才"有效"。否则你会越界并调用未定义行为。
array_size
假设在数组末尾有一个0
。
代码2不正确。不能假设数组以0
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '