malloc 接触未分配的内存
malloc touching unallocated memory
我想知道为什么我的分配有效。我创建了 ptr
这是一个指针,ptr2
是一个与 ptr
.
在同一位置的指针
这是我的代码:
int* ptr = malloc(sizeof(int));
int* ptr2 = ptr;
*ptr2 = 1;
ptr2 = ptr+1;
*ptr2 = 2;
最后我得到了一个包含两个整数的数组:
ptr[0] = 1
ptr[1] = 2
我的问题是:为什么我可以在没有错误或警告的情况下将值 2 更改为 ptr2
?我只 malloc()
-ed 了数组中的一个整数位置,不是吗?
这里的问题是,说
ptr2 = ptr+1;
您指的是超出限制的内存。接下来在取消引用时,您调用 undefined behavior。现在,UB 的结果无论如何都无法证明。
C 中没有任何内容可以阻止您 访问越界(或无效)内存,但这样做的结果是 UB。
也就是说,这只是一个建议,在使用该指针之前,您应该始终检查 malloc()
的返回值,以通过取消引用 NULL
指针来避免 UB,以防 malloc()
失败.
我想知道为什么我的分配有效。我创建了 ptr
这是一个指针,ptr2
是一个与 ptr
.
这是我的代码:
int* ptr = malloc(sizeof(int));
int* ptr2 = ptr;
*ptr2 = 1;
ptr2 = ptr+1;
*ptr2 = 2;
最后我得到了一个包含两个整数的数组:
ptr[0] = 1
ptr[1] = 2
我的问题是:为什么我可以在没有错误或警告的情况下将值 2 更改为 ptr2
?我只 malloc()
-ed 了数组中的一个整数位置,不是吗?
这里的问题是,说
ptr2 = ptr+1;
您指的是超出限制的内存。接下来在取消引用时,您调用 undefined behavior。现在,UB 的结果无论如何都无法证明。
C 中没有任何内容可以阻止您 访问越界(或无效)内存,但这样做的结果是 UB。
也就是说,这只是一个建议,在使用该指针之前,您应该始终检查 malloc()
的返回值,以通过取消引用 NULL
指针来避免 UB,以防 malloc()
失败.