YYhotpot 2022-08-07 14:32 采纳率: 100%
浏览 44
已结题

为什么打印同一个地址,主函数和函数的结果会不同?

问题遇到的现象和发生背景

同一个存储地址,为什么在 主函数main 和 被调函数 里 会打印出不一样的结果?
这是一个通过函数ReverseSortCopy()进行数组倒叙排列的任务,
因为不想改变原数组的数据,所以在ReverseSortCopy()中将原数组复制进新的数组,并在新数组中操作排序,完成后函数返回一个地址。
再通过这个地址在主函数中打印返回地址里的值(已排序完的新数组)。
可是,在ReverseSortCopy()函数里,根据地址可以正常打印结果,
但同样的地址在主函数里就打印出不一样的值,请问这是为什么?

问题相关代码,请勿粘贴截图
//设计一个函数,完成倒叙排列。
#include <stdio.h>
#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;
}


运行结果及报错内容

img

在主函数中打印了函数ReverseSortCopy()传回来的地址中的值,发现不对。求指点~

  • 写回答

2条回答 默认 最新

  • a5156520 2022-08-07 14:57
    关注

    在函数定义的数组,在函数返回后其内存空间的值一般会被清空,所以在main函数里打印ReverseSortCopy()函数里定义的数组,其元素值数据一般是被清空了。(可以在ReverseSortCopy()函数里直接排序arr指针指向的数组,然后在main函数可以看到其排序后结果,因为arr指针指向的数组在main函数执行期间是一直存在的。)


    或者将ReverseSortCopy()定义的数组提到所有函数之前将其设置为全局变量作为一个折中的办法,那这个数组的内存数据在程序执行期间就一直存在,所以在ReverseSortCopy()函数修改其值后也是可以在main函数正确访问到其保存的值的。
    参考链接:
    https://bbs.csdn.net/topics/350084495
    C语言入门篇--局部全局变量的作用域及生命周期_C/C++_服务器之家

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月24日
  • 已采纳回答 8月16日
  • 创建了问题 8月7日

悬赏问题

  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 Macbookpro 连接热点正常上网,连接不了Wi-Fi。
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题