首页 > 解决方案 > 在 C++ 和指针中分配内存的问题

问题描述

所以我现在正在学习动态内存分配并陷入了一个问题(如果是的话)。

int *p;
p=(int*)calloc(5,sizeof(int));

根据我的直觉,p 应该指向 5*4 = 20byte 的内存位置,而这 20bytes 只属于 p。对于 *(p+0), (p+1).... (p+4) 一切都很好。但是当我做 *(p+5) 或 *(p+12)=100; 这应该给我一个错误,因为我已经超出了分配给 *p 的内存块。

困惑是:为什么我们甚至需要分配内存,而我们可以这样做:

int *p
int s[]={1,2,3}
p=&s[0]
//and then make an array of length > s
*(p+4)=....something

在每篇文章中,我都看到他们在分配之前分配内存。有什么需要。我希望你能理解我的困惑。

标签: c++cpointersmallocc++14

解决方案


根据我的直觉 p 应该指向 5*4 = 20byte 的内存位置

假设该系统上的大小int是 4,那么分配是 20 字节。

而这20bytes只属于p

的确。p是唯一指向分配的指针,所以它是唯一可以用来释放它的指针,所以说它是内存的“所有者”。

但是当我做 *(p+5) 或 *(p+12)=100; 这应该给我一个错误

没有。越界访问内存的行为是未定义的。不保证错误。

为什么我们甚至需要分配内存时我们可以这样做:

因为我们不想在我们的程序中有未定义的行为。具有未定义的行为通常是一个严重的错误。我们不希望我们的程序崩溃。我们没有删除所有数据的程序。我们不希望我们的程序将我们的客户数据泄露给黑客。相反,我们更喜欢我们的程序具有定义的行为,以便我们可以控制该行为。


推荐阅读