1)无效场景
int *p = (int*)malloc(sizeof(p));
int main(void)
{
*p = 10;
printf("%d", *p);
}
2)无效场景
int main(void){
static int *p = (int*)malloc(sizeof(p));
}
3)//有效场景
int main(void){
static int *p;
p = (int*)malloc(sizeof(p));
}
4)有效场景
int *p;
int main(void)
{
p = (int*)malloc(sizeof(p));
*p = 10;
printf("%d", *p);
}
为什么场景1和场景2无效,场景3和场景4有效?
从根本上说,唯一真正的答案可以简单地归结为"这些就是规则"。C 可以有不同的指定,这样你所询问的用法都是有效的,但它不是。
也许你问的是基本原理。当然,C选择的方法更简单,因为它允许从存储在程序映像中的数据初始化所有静态持续时间的对象(包括所有全局对象和static
局部对象)。如果允许初始化器不是编译时常量,则需要在调用main()
之前,在初始化器中开始执行程序。那样会更复杂更混乱。