同一个存储地址,为什么在 主函数main 和 被调函数 里 会打印出不一样的结果?
这是一个通过函数ReverseSortCopy()进行数组倒叙排列的任务,
因为不想改变原数组的数据,所以在ReverseSortCopy()中将原数组复制进新的数组,并在新数组中操作排序,完成后函数返回一个地址。
再通过这个地址在主函数中打印返回地址里的值(已排序完的新数组)。
可是,在ReverseSortCopy()函数里,根据地址可以正常打印结果,
但同样的地址在主函数里就打印出不一样的值,请问这是为什么?
//设计一个函数,完成倒叙排列。
#include
#define LEN 7
void ShowOriginI(const double arr[], int index); //打印原数组排列。
double * ReverseSortCopy(double *arr, int index); //倒序排列,并传回一个指向double型元素的指针。
int main(void)
{
double array[LEN] = {0.3, 6.2, 9.7, 4.2, 5.3, 1.4, 7.5};
double *p; //用来储存 排序函数 返回的指针。
printf("The original sort:\n");
ShowOriginI(array, LEN); //打印原数组排列。
printf("The reversed sort:\n");
p = ReverseSortCopy(array, LEN); //存地址。
printf("\n");
printf(" p address: %p\n", p); //地址和ReverseSortCopy里的新数组地址一致。
printf("*p: %.1f ", *p); //测试,打印地址里面的值。
printf("\n");
return 0;
}
void ShowOriginI(const double arr[], int index)
{
int i;
for (i = 0; i < index; i ++)
{
printf("%.1f ", arr[i]);
}
printf("\n");
}
double * ReverseSortCopy(double *arr, int index)
{
double CopyArray[LEN]; //新数组。
int i, j;
double temp;
double *p;
for (i = 0; i < index; i ++) // 将原数组数据 复制进 新数组。
{
CopyArray[i] = *(arr + i);
}
for (i = 0; i < index; i ++) // 倒序排列。
{
for (j = i; j < index; j ++)
{
if (CopyArray[i] < CopyArray[j])
{
temp = CopyArray[i];
CopyArray[i] = CopyArray[j];
CopyArray[j] = temp;
}
}
}
p = CopyArray;
for (i = 0; i < index; i ++) //用指针的方式,打印排列好的结果。
{
printf("%.1f ", *(p + i));
}
printf("\n");
printf("CopyArray's address: %p\n", CopyArray); //确认新数组的首地址,并在主函数中与 传回的地址 进行比对。
return p;
}
在主函数中打印了函数ReverseSortCopy()传回来的地址中的值,发现不对。求指点~
在函数定义的数组,在函数返回后其内存空间的值一般会被清空,所以在main函数里打印ReverseSortCopy()函数里定义的数组,其元素值数据一般是被清空了。(可以在ReverseSortCopy()函数里直接排序arr指针指向的数组,然后在main函数可以看到其排序后结果,因为arr指针指向的数组在main函数执行期间是一直存在的。)
或者将ReverseSortCopy()定义的数组提到所有函数之前将其设置为全局变量作为一个折中的办法,那这个数组的内存数据在程序执行期间就一直存在,所以在ReverseSortCopy()函数修改其值后也是可以在main函数正确访问到其保存的值的。
参考链接:
https://bbs.csdn.net/topics/350084495
C语言入门篇--局部全局变量的作用域及生命周期_C/C++_服务器之家
你这样做很危险!CopyArray在函数结束之后内存就会释放,所以产生的是随机值!