所以我现在正在学习动态内存分配并陷入了一个问题(如果是的话)。
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/