我碰巧问自己一个关于c ++中数组的问题。 好吧,我们都知道数组是某些东西的固定集合,我说固定是因为在定义数组时需要声明数组长度。 好吧,让我们考虑一个例子:
char myarray[10] = {'\0'};
int sz = sizeof(myarray); // It is supposed to be 10
嗯,这是正确的,10是sizeof返回的数字。这可以由编译器完成,因为他知道它为该变量放置了多少空间。
现在考虑在这种情况下会发生什么:
void dosome(mystruct* arr) {
int elements = sizeof(arr)/sizeof(mystruct);
for (int i = 0; i < elements; i++) {
// Do something hoping no overflow will ever occur
}
}
很好......但我认为它可能溢出。如果我将一个以“正常”方式创建的数组传递给此函数,那么一切都应该没问题:
mystruct array[20];
dosome(array);
没问题。但如果我这样做:
mystruct* array = (mystruct*)malloc(80*sizeof(mystruct));
dosome(array);
发生什么事情???????????????? 我想了解sizeof的行为,这个函数在编译时被评估了吗???好吧,当我不使用数组时会发生什么,但是像那样的数据块之类的东西非常麻烦?此外,我可以重新分配它再次调用malloc并要求dosome再次处理该数据块。它会起作用吗? 我可以尝试一下,但我会得到一些关于sizeof行为的确切答案。
谢谢。
答案 0 :(得分:2)
从mystruct array[20]
示例开始是错误的。因为函数接收指针类型而不是数组类型,所以它不能推断出数组中元素的数量。当您执行mystruct*
时,实际上是sizeof(arr)
的大小。
你可以使用模板来编写以数组为参数的函数,但是如果我没有错的话,C ++中建议的方法是使用vector
。
接收数组作为参数的“方式”是写出类似的东西:
template <int N> void somefunction(int (&v)[N]);
编辑更正了功能声明。糟糕。
答案 1 :(得分:1)
void dosome(mystruct* arr) {
int elements = sizeof(arr)/sizeof(mystruct);
for (int i = 0; i < elements; i++) {
// Do something hoping no overflow will ever occur
}
}
在这个例子中,arr有什么类型? mystruct*
!它的大小很可能是4或8.如果你想将静态/自动分配的数组(不是新的)传递给保留大小以保证你的技巧有效的函数,请参考REFERENCE!
template <int N>
void dosome(mystruct (& arr) [N]) {
for (int i = 0; i < N; i++) {
// Do something . No overflow will occur
}
}
还要注意这个
int a[20];
sizof a; //equals to 20*sizeof(int)
int* b = new int [20];
sizeof b; //equals to sizeof pointer, most likely 4
答案 2 :(得分:0)
sizeof是一个编译时运算符。在这里它只计算指针的大小。