为什么malloc(1000*1000*1000*1000*1000*...*1000)能在32位机器上分配成功并使用

首先这个问题我们直接通过代码运行告诉答案:

int main()
{
	long long aa = 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000;
	void* a = malloc(1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000);
	std::cout << aa;
	return 0;
}

首先这个问题表现形式是:运行malloc分配内存,这个明显在32位机器上是超过4g内存的,但是在运行时并没有报错,还是能正常运行。下面就会回答这个问题:

首先int会自动向上转为longlong,然后longlong表达的整数是有范围的,编译器会自动对溢出值进行处理。所以我们直接将malloc的值赋给longlong类型的aa变量,然后看输出值为多少,来看到底malloc(1000*...*1000)到底变成什么了:

 然后使用补码转原码工具

可以看到补码转原码值直接为0了。所以上述代码其实变为 malloc(0),这就是为什么malloc(1000*...*1000)是能过编译了。 

猜你喜欢

转载自blog.csdn.net/qq_51710331/article/details/130536170