大家好,本人在学习数组指针时,编写了一个小的赋值程序,但程序中确出现了指针地址自动改变的“诡异现象”,现将代码和出现的问题描述如下,求各位大神指教,万分感谢!!
template<typename T>
T** MemAlloc2d(int NoCols, int NoRows)
{
int k;
T** matrix2d;
matrix2d = (T **)malloc((NoRows)*sizeof(T *));
for(k=0; k<NoCols; k++)
{
*(matrix2d + k) =(T*)malloc((NoRows)*sizeof(T));
}
return matrix2d;
}
template<typename T>
void MemFree2d(T** matrix2d, int NoCols, int NoRows)
{
int k;
for(k=0; k<NoCols; k++)
{
free(*(matrix2d + k));
}
free(matrix2d);
}
int _tmain(int argc, _TCHAR* argv[])
{
float** pData = MemAlloc2d<float>(517,495);
for(int i = 0;i < 517; i++)
{
float* temp = new float[495];
for(int i = 0; i< 495; i++)
{
temp[i] = i + 0.1f;
}
memcpy(&pData[i][0],temp,495*sizeof(float));
delete[] temp;
}
MemFree2d<float>(pData,517,495);
}
在VS2008中运行程序出现【Unhandled exception at 0x1026edac (msvcr90d.dll) in QtHello.exe: 0xC0000005: Access violation writing location 0x3dcccccd】,手动进入调试后发现,原来在执行33行代码后,pData[510]及其之后分配的内存地址发生了改变。执行33行代码前&pData[510][0]为0x02aa6100,执行后变为0x3dcccccd,即原先分配的内存地址自动改变了。
指针 内存分配
------解决方案--------------------------------------------------------
for(int j= 0; j< 495; j++)
{
temp[j] = j + 0.1f;
}
memcpy(&pData[i][0],temp,495*siz