我不太了解内存分配实际上是如何工作的,但这会带来什么问题:
int main(){
int a=1;
int *p = &a;
p++;
*p = 2;
printf("%d", *p);
return 0;
}
答案 0 :(得分:3)
通常,它会产生未定义的行为,通常会导致内存访问冲突。
但是,在您的示例中,它可能正常工作,因为变量p
可能位于堆栈中的变量a
之后(受到您正在使用的编译器的影响),因此通过递增值变量p
你基本上把它设置为指向它自己。
现在,如果sizeof(p) == sizeof(*p)
,即if sizeof(int*) == sizeof(int)
,恰好是许多编译器(两者都等于4)的情况,那么当你将值写入{{ {1}},您要将p
和p
设置为该值。
请注意,任何后续尝试将值写入*p
指向的地址的行为都等同于将值写入程序的内存空间中的地址2,这次将最有可能导致内存访问冲突。
答案 1 :(得分:1)
否即可。使用未分配的内存位置进行读取或写入是不合法的。它调用未定义的行为
答案 2 :(得分:1)
您正在覆盖自己未分配的内存。这推断出未定义的行为,根据定义,这种行为并不好,因此不合法"。
答案 3 :(得分:0)
永远不要试图访问未被自己定义/分配的内存,因为这会导致某些不可预测的内容。 这不会产生语法错误,但可以生成运行时错误。 因此,在访问仅由您分配的内存之前,请务必确保。