内存分配如何在c ++中发生

时间:2016-12-14 12:58:29

标签: c++ arrays

我是c ++的新手,也是尝试使用函数打印数组的练习。我创建了两个数组arrarr2,如下所示。

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

有人可以解释这里发生的事情吗?如果你的内存分配有问题,请高度赞赏,如果你能用适当的图解释。

3 个答案:

答案 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]的地址重合,是有道理的(但很好,因为它是未定义的行为,任何事情都可能发生)。

由于您要分配到堆栈中的地址,因此您不会遇到段错误但是损坏堆栈,但这比获取段错误要糟糕得多:

  • 段错误是一个明确的信号,告诉您正在尝试非法内存访问。你知道它发生在哪里,你可以解决它。
  • 堆栈损坏以静默方式发生,并且可能会被忽视,直到它崩溃程序,这可能发生在任何地方。这是&#34;非法&#34;的结果。由于堆栈已经为您的程序保留,因此未被检测到的内存访问。当然,调试它非常困难,因为崩溃可能发生在与错误代码完全无关的地方。

答案 1 :(得分:2)

arr2不是数组。它是指向int i的指针。你正在阅读不属于你的记忆。

相反,请使用:

int* arr2 = new int[how_long_array_you_want]

不要忘记删除arr2

答案 2 :(得分:-2)

哇没有sigsegv? 只是一个因子组合,可能(在机器内部)我在数组之前声明的变量。 所以你不能这样做。 变量&#34; i&#34;只为整数分配一个槽。但你需要5.当你做*(arr2 + 1)时,你要写一个ungulty,邻居随机变量。在这种情况下,可能是arr []。幸运的是也是一个整数,否则你将得到一个SIGSEGV错误 所以代码将是

int i[5];
int *arr2=i;

所以它有效