我是c ++的新手,也是尝试使用函数打印数组的练习。我创建了两个数组arr
和arr2
,如下所示。
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
有人可以解释这里发生的事情吗?如果你的内存分配有问题,请高度赞赏,如果你能用适当的图解释。
答案 0 :(得分:3)
您声明的变量在堆栈中声明:
int arr[5] = { 11, 12, 13, 14, 15 }; // 5xsizeof (int) bytes
int i = 1; // sizeof (int) bytes on the stack
int *arr2 = &i; // sizeof (void*) bytes on the stack
现在arr2
是指向int
的指针。在另一个上下文中,它可以是指向动态分配的数组的指针,但在这里,它不是:它指向堆栈上i
的位置。当你这样做时:
*(arr2 + 1) = 2;
您正在将2
分配给堆栈中的另一个地址(&i
之后的那个地址),并且从您的结果看起来它与arr[0]
的地址重合,是有道理的(但很好,因为它是未定义的行为,任何事情都可能发生)。
由于您要分配到堆栈中的地址,因此您不会遇到段错误但是损坏堆栈,但这比获取段错误要糟糕得多:
答案 1 :(得分:2)
arr2
不是数组。它是指向int i
的指针。你正在阅读不属于你的记忆。
相反,请使用:
int* arr2 = new int[how_long_array_you_want]
不要忘记删除arr2
。
答案 2 :(得分:-2)
int i[5];
int *arr2=i;
所以它有效