我是新來的c + +和嘗試使用函數打印數組的練習。我創建了兩個數組arr
和arr2
,如下所示。如何內存分配發生在c + +
int main(){
int arr[5] = {11, 12, 13, 14, 15};
int i =1;
int* arr2 = &i;
*arr2 =1;
*(arr2+1) =2;
*(arr2+2) =3;
*(arr2+3) =4;
*(arr2+4) =5;
printArray(arr2,5);
printArray(arr,5);
}
我想使用下面的函數打印這兩個數組。
void printArray(int arr[],int size){
for(int i=0; i<size; i++){
cout<<*(arr+i)<<" ";
}
cout<<endl;
}
運行該程序後的結果是,
1 2 3 4 5
2 3 4 5 15
但該預期的結果,
1 2 3 4 5
11 12 13 14 15
有人能解釋發生在這裏,如果是內存問題分配高度讚賞,如果你可以解釋一個適當的圖。
你有*未定義的行爲*。 'arr2'不是指向一個5'int'的塊,而是一個'int'。所以,'*(arr2 + 1)= 2; *(arr2 + 2)= 3; *(arr2 + 3)= 4; *(arr2 + 4)= 5;'邊界外的所有訪問。在'printArray()'函數中打印'arr2'時,同樣的問題仍然存在。 –
這是未定義的行爲 – CoryKramer
正如已經指出的那樣,這是UB,顯然你的編譯器決定在'arr'之前分配'i',這樣'(arr2 + 1)==&arr [0]' - 但是這是** NO **方式正確或保證(不同的編譯器或只是改變優化級別可能已經導致完全不同的效果) – UnholySheep