c++ - C++中分配内存和指针的问题

标签 c++ c pointers malloc c++14

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

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

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

最佳答案

According to my intution p should point to memory location of 5*4 = 20byte

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

and these 20bytes only belong to p

确实如此。 p 是唯一指向分配的指针,因此它是唯一可用于释放它的指针,因此被称为内存的“所有者”。

but when i do *(p+5) or *(p+12)=100; This should give me an error

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

Why we need to even allocate memory when we can just do like :

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

关于c++ - C++中分配内存和指针的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59691488/

相关文章:

c++ - 将 LONG 转换为函数指针?

c++ - 将 double * 赋值给 V[3]

python - 一起调试boost暴露的Python和C++

c++ - 这个 bin-to-dec 代码有什么问题?

c - 如何创建将 stdin 重定向到子进程的代理进程?

c - Ubuntu 将命令行参数传递给 C 程序

c - 使用指针逐字打印

c++ - 将数组作为参数传递给 printf

c++ - *bool 数组是否被正确删除 C++

c - 在 union 中使用多个相同类型的结构