Lal*_*wal 4 c linux memory windows layout
当我在Windows和Linux上运行下面编写的代码时,我会得到两个不同的输出.
我正在使用gcc.当我在Windows上运行时,我将"Seek"作为输出,而在Linux上运行它,我将"Hide"作为输出.Windows和Linux的内存布局有什么不同,还是有其他原因导致输出不同?
int main()
{
int a=0;
int *b=(int *)malloc(sizeof(int));
if(&a>b)
printf("Hide");
else
printf("Seek");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
返回值malloc未指定(可以是任何值)。换句话说,标准的任何部分都不保证返回值的可预测性。这是 C 语言标准的一部分,而不是特定于平台的,并且与内存布局没有真正的关系。来自C99标准:
\n\n\n7.20.3 内存管理函数
\n\n1 通过连续调用 calloc、malloc 和\n realloc 函数分配的存储的顺序和连续性未指定\xef\xac\x81ed。如果分配成功,返回的指针将被适当对齐,以便可以将其分配给指向任何类型对象的指针,然后用于访问分配的空间中的此类对象或此类对象的数组(直到空间被显式释放)。已分配对象的生命周期从分配开始一直延伸到释放为止。每个这样的分配将产生一个指向与任何其他对象不相交的对象的指针。返回的指针指向分配空间的起始位置(最低字节地址)。如果无法分配空间,则返回空指针。如果请求的空间大小为零,则行为是\n 实现定义的:返回空指针,或者\n 行为就像大小是某个非零值,除了\n n 返回的指针不得用于访问对象
\n
您遇到的是实现定义的行为,不能保证将来仍然有效。事实上,甚至不能保证它在当前版本的 Windows/Linux 中保持不变。
\n