处理数组大小

时间:2010-11-25 14:04:45

标签: c++ arrays sizeof

我碰巧问自己一个关于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行为的确切答案。

谢谢。

3 个答案:

答案 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是一个编译时运算符。在这里它只计算指针的大小。