int *p;
void fun(int *pCopy);
在函数fun调用过程,pCopy是p的副本,退出函数时会销毁pCopy,但是p和pCopy指向同一内存地址,因此在函数内操作pCopy会改变p指向的数据的值。
但是在使用malloc,realloc函数时遇到一问题。
int *p = (int*) malloc (5*sizeof(int));
cout<<"p : "<<_msize(p)/sizeof(int)<<endl;
addLength(p);
cout<<"p : "<<_msize(p)/sizeof(int)<<endl; //程序在这中断
void addLength(int *pCopy)
{
int Length = _msize(pCopy)/sizeof(int);
pCopy = (int*) realloc (pCopy,(Length + 1)*sizeof(int));
}
在函数里想要动态的增加p指向的空间大小。一般理解,操作pCopy等同于操作p。但是调用_msize函数未成功。
查看msdn,The _msize function returns the size, in bytes, of the memory block allocated by a call tocalloc, malloc, or realloc。
_msize函数对指针有要求,指针不能变,除了使用calloc,malloc,realloc操作的指针。
现在代码的情况是,在函数里改变了p指向的内存空间,但是指针p本身没有发生改变,_msize函数无法使用。
解决的方法是使用指针的引用。
int *p = (int*) malloc (5*sizeof(int));
cout<<"p : "<<_msize(p)/sizeof(int)<<endl;
addLength(p);
cout<<"p : "<<_msize(p)/sizeof(int)<<endl;
void addLength(int *&pCopy)
{
int Length = _msize(pCopy)/sizeof(int);
pCopy = (int*) realloc (pCopy,(Length + 1)*sizeof(int));
}
这样pCopy就变成p的引用了,操作引用pCopy相当于操作p,这样通过了。
遗留Bug,上面代码若是
int *p = (int*) malloc (5*sizeof(int));
//cout<<"p : "<<_msize(p)/sizeof(int)<<endl;
addLength(p);
cout<<"p : "<<_msize(p)/sizeof(int)<<endl;
void addLength(int *pCopy)
{
int Length = _msize(pCopy)/sizeof(int);
pCopy = (int*) realloc (pCopy,(Length + 1)*sizeof(int));
}
则通过……………………
很奇怪,估计还是跟_msize函数有关,求指导。追踪变量发现:
如果多一句输出语句则在Add之后p指向的数据变了,如果没有那一句输出语句则Add之后p指向没变。无法理解。