realloc函数返回的指针是不是和改变大小前的指针的起始地址是一样的,只是结束地址因为大小改变了而不一样?
图中书上划线的地方(指向新地址)说的有问题吗?
我在以下程序中输出fDouble和iInt的值验证是一样的啊
#include<stdio.h>
#include <stdlib.h>
int main()
{
double *fDouble; /*定义实型指针*/
float* iInt; /*定义整型指针*/
fDouble=(double*)malloc(sizeof(double)); /*使用malloc函数分配实型空间*/
printf("%d\n",fDouble);
printf("%d\n",sizeof(*fDouble)); /*输出空间的大小*/
iInt=(float *)realloc(fDouble,sizeof(float)); /*使用realloc改变分配空间大小*/
printf("%d\n",iInt);
printf("%d\n",sizeof(*iInt));
return 0;
}
图片说明](https://img-ask.csdn.net/upload/201708/04/1501831333_593962.png)
题目中的这个现象属于典型的 未定义行为 (undefined behavior),也称为不确定行为。
realloc函数会根据传入的参数尝试重新分配内存,可能成功,也可能失败。
即使成功,新分配的内存地址可能与之前的相同,也可能不相同。
和内存对齐,编译器优化等很多因素有关。
C++中未定义行为有很多,比如论坛中经常提问的 ++ -- 表达式求值问题也是如此。
对于此类问题,最好的办法是参考C/C++标准和msdn。
回到题目,我在visual studio 2015下测试,两者内存地址就是不相等的。
如果对您有帮助,请采纳答案好吗,谢谢!
不是的,realloc是重新分配空间,如果重新分配的空间在原来的地方放不下,则会寻找新的连续的空间放置,这个时候其实地址则会改变。
但是如果重新分配的空间在原本的内存中放得下那么会出现地址没有改变的现象。