我想了解C 99中动态分配数组的工作原理。无论如何,我有以下代码:
int main()
{
char** members=malloc(4*sizeof(*members));
*members=malloc(5);
*members="john";
*(members+1)="shouldn't work";
printf("%s \n",*members);
printf("%s",*(members+1));
return 0;
}
我以为会因为没有分配(members+1)而产生运行时错误,但实际上它打印了"john"和"shouldn't work",而且看起来 *members=malloc(5)这一行是不必要的。为什么呢?
*(members + 1)
中的任何内容,而不是确定性错误条件。 - cmaster - reinstate monicastrcpy
是未定义行为,但是大多数现代操作系统会将新分配的内存页初始化为0
以作为安全预防措施,所以解引用会导致 AV。如果进程之前已经释放了内存,则一切都不确定。 - MooseBoys