c++ - 在 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
在每篇文章中,我都看到他们在分配之前分配内存。有什么需要。我希望你能理解我的困惑。
解决方案
根据我的直觉 p 应该指向 5*4 = 20byte 的内存位置
假设该系统上的大小int
是 4,那么分配是 20 字节。
而这20bytes只属于p
的确。p
是唯一指向分配的指针,所以它是唯一可以用来释放它的指针,所以说它是内存的“所有者”。
但是当我做 *(p+5) 或 *(p+12)=100; 这应该给我一个错误
没有。越界访问内存的行为是未定义的。不保证错误。
为什么我们甚至需要分配内存时我们可以这样做:
因为我们不想在我们的程序中有未定义的行为。具有未定义的行为通常是一个严重的错误。我们不希望我们的程序崩溃。我们没有删除所有数据的程序。我们不希望我们的程序将我们的客户数据泄露给黑客。相反,我们更喜欢我们的程序具有定义的行为,以便我们可以控制该行为。
推荐阅读
- c++ - 如何跟踪添加到我的图形场景中的 QAbstractGraphicsShapeItem 的索引
- android - adb 服务器版本 (40) 与此客户端 (41) 不匹配;杀戮
- html - 在文本块中保留换行符,但限制为一行
- android - 时间到了,我的应用程序无法响铃 android q
- java - 如何使用 java 9 流实现简单 mvc 的观察者/可观察模式?
- python - 搜索数组中前 5 个最大的数字
- kotlin - 如何“压缩”两个或多个协程通道?
- python - Groupby、Shift 和 Sum
- python - 使用 pandas DataFrame 的多列的 relplot() 连续误差条图
- javascript - 我无法弄清楚为什么我的 ajax 没有将数据发送到我的 php 文件