2010-11-25 64 views
3

我碰巧问自己一个关于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,并要求再次处理该数据块。它会起作用吗? 我可以尝试一下身体,但是我会得到一些有关sizeof行为的确切答案。

谢谢。

+2

在`dosome`,`的sizeof(ARR)`是`的sizeof(MYSTRUCT *)`不管如果你用C开发的功能被称为 – icecrime 2010-11-25 14:07:32

+0

方式++,然后尽可能使用`new`而不是`malloc`。如果你像这样定义你的数组,你的代码仍然行为不端:`mystruct * array = new mystruct [20];`? – suszterpatt 2010-11-25 14:10:07

+0

icecrime是对的,你有错误的期望 – Simone 2010-11-25 14:10:20

回答

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.如果你想通过静态/自动分配的数组(不是new'd)来保存大小,以便你的技巧可以工作,请通过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

mystruct array[20]例子开始是错误的。由于该函数接收的是指针类型,而不是数组类型,因此无法推导出数组中元素的数量。当您执行sizeof(arr)时,您实际上得到的尺寸为mystruct*

可以使用模板来编写以数组为参数的函数,但是如果我没有错,C++中的建议方法是使用vector

该“办法”接受数组作为参数,将写类似:

template <int N> void somefunction(int (&v)[N]); 

编辑修正函数声明。哎呀。

0

sizeof是一个编译时操作符。在这里它只计算一个指针的大小。