saoqing 发表于 2018-11-12 09:12:45

求解答这段神奇的代码

本帖最后由 saoqing 于 2018-11-14 13:59 编辑

//Main.c文件

#include<stdio.h>


void print(int n)
{
        printf("%d\n", n);
}

int* print2(int n, int m, char a)
{

        printf("print2 %d\t%c\n", n+m,a);
        //char c = a;
        int n1 = n;
        return &n1;
        //return &n;
}
int main() {
        //funParn("int-int-int","");
        fun(10, print2);
        return 0;
}

//test.c文件
#include<stdio.h>
#include < stdarg.h>

typedef (*P)();

void fun(int n, P print)
{
        int i;
        for (i = 0; i < n; i++)
        {       
                char a = 'a';
                double r;
                int *q;
                q=print(i,i,a);
                r = i + i;
                if (*q == i)
                {
                        printf("====");
                }
                printf("%d\n", *q);       
                a++;
        }
}




为什么在main.c中直接return &n
和在main.c中将n的值赋给n1再return &n1
两个结果不一样

第一张图是return &n1
第二张图是return &n

n1




社会我鱼哥 发表于 2018-11-12 09:24:30

你返回&n1是n1的地址,n1在你定义的时候内存给他分配了新的地址,你要是想用别的变量来接受,必须要用指针变量,这样才能存储数据

前路 发表于 2018-11-12 17:27:39

首先,发现这个问题与以下知识有关:全局与局部变量;&取地址符号与指针函数的内存
开始:int* print2(int n, int m, char a)是创建的一个int型指针函数,对应的你在里面创建的变量n1是一个属于指针函数里的一个局部变量作用范围和生存周期都是受限的;
return &n1,返回的是局部变量n1的地址值,但是你的结果却是0~9:在我的认知里来讲一个全局变量的地址返回出来这应该会要报错的,但是你却返回出来了,这就有点不明白了
return &n,返回的是全局变量n的地址值,所以一直是5635004

saoqing 发表于 2018-11-14 13:52:58

前路 发表于 2018-11-12 17:27
首先,发现这个问题与以下知识有关:全局与局部变量;&取地址符号与指针函数的内存
开始:int* print2(int ...


saoqing 发表于 2018-11-14 13:54:49

本帖最后由 saoqing 于 2018-11-14 14:00 编辑

前路 发表于 2018-11-12 17:27
首先,发现这个问题与以下知识有关:全局与局部变量;&取地址符号与指针函数的内存
开始:int* print2(int ...

不好意思,之前发的贴子有误,已改正
页: [1]
查看完整版本: 求解答这段神奇的代码