为什么这个sizeof运算符会出错
Why is this sizeof operator giving error?
在这个程序中,行int len = sizeof(*a)/sizeof(int);
给出了错误,但是如果我写这个int len = sizeof(**a)/sizeof(int);
或这个int len = sizeof(a)/sizeof(int);
,它可以正常工作。为什么?这里a
保存1-D数组的地址,当我这样做时,*a
,它给出数组的第一个元素的地址,最后**a
给出元素本身。因此,基于此,int len = sizeof(*a)/sizeof(int);
应该可以正常工作,不是吗?
#include <stdio.h>
void func(int (*a)[]){
printf("%d %dn", sizeof(a), sizeof(int));
int len = sizeof(*a)/sizeof(int); // error
for(int i = 0; i < len; ++i){
printf("%d ", (*a)[i]);
}
}
int main(){
int a[][3] = {
{1, 2, 3},
{4, 5, 6}
};
func(a);
return 0;
}
参数a是指向不完整类型的指针。不能对其使用sizeof,因为它是指向数组的指针,并且未定义数组的大小。
你可以定义它:
void func(int (*a)[10]){
在这种情况下,sizeof(*a)
将等于sizeof( int )*10
,并且sizeof(*a)/sizeof(int);
将给出a的元素计数,在这种情况中为10。
由于您要将指针传递给大小为3的数组,因此应该使用3而不是10。您可以使用正向参数来具有可变大小的参数a
。
标准规定:
C11:6.5.3.4
sizeof
运算符不应应用于具有函数类型或不完整类型[..]的表达式
未知大小的数组类型是不完整类型(C11:6.2.5类型--p22)。func
中的*a
是不完全类型。在将a
用作sizeof
的操作数之前,需要指定它指向的数组的长度。
相关文章:
- 在 myVector 类中重载运算符 + 时出错
- 使用运算符调用 void 函数时出错<set>
- 通过 [] 运算符访问unordered_map时出错
- 在重载 + 和 - 运算符时出错
- 重载运算符时出错<在 sf::Vector 中
- 将运算符<<与隐式转换的非基本数据类型一起使用时出错
- Rcpp/C++/R:比较日期时间矢量与日期时间时出错(错误:"运算符>"的不明确重载)
- 令牌之前缺少二进制运算符 "#" 当 #define 在 #if 内时出错
- 在运算符中将联合作为参数传递时出错<<
- 迭代器关系运算符出错(带单独链接和迭代器的自定义哈希表)
- 尝试重载模板类友元<<运算符时出错
- 使用 getline 重载 istream 运算符>> 会出错
- 灵气:用期望运算符替换序列时出错
- 在类外部定义显式运算符 bool() 时出错
- 擦除矢量中的对象时出错.如何将移动作业运算符添加到我的类中
- 过载运算符出错>>
- 在使用C (Microsoft vs)中使用指针和新运算符时出错
- 运算符重载时出错(错误:"运算符<<不匹配(操作数类型为"std::basic_ostream<char>"和"const char [2]")
- static_cast为int时删除布尔运算符时出错
- 为什么我会出错?运算符[]过载