以下代码段的输出是什么?

时间:2013-11-22 17:12:57

标签: c function pointers

在clrscr之后发生了什么?

#include<stdio.h>
#include<conio.h>
int *call();
void main()
{
int *ptr;
ptr=call();
clrscr();
printf("%d",*ptr);
getch();
}  

int*call()
{
int a=25;
a++;
return &a;
}

output:
-10

代码的工作方式如下: 调用call(),a = 25,然后a = 26。令地址为65518.此地址返回给ptr。因为返回类型是int,而不是65518,(由于循环属性)返回-18。 所以ptr =&amp; a = -18。然后clrscr清除它......但是如何将*ptr打印为输出?我的意思是地址不能为负数(-18)。

3 个答案:

答案 0 :(得分:1)

返回指向local的指针是未定义的行为。任何事情都可能发生 - 你的程序可能崩溃,但更有可能打印一些任意数字。

如果需要从C函数返回指针,则需要在动态存储中分配一个内存块,如下所示:

int*call()
{
    int *a=malloc(sizeof(int));
    *a = 25;
    *a++;
    return a;
}

或使用指向静态分配块的指针,如下所示:

int* call()
{
    static int a=25;
    a++;
    return &a;
}

如果选择动态分配路由,则调用者必须释放函数返回的指针。

答案 1 :(得分:0)

int*call()
{
int a=25; // <--- use malloc here i.e. int a = malloc(sizeof(int)); then you can set a value to a and return the pointer without any problemk, OTHERWISE => it will return an address of some random junks you don't want, its gonna be completely random
a++;
return &a;
}

答案 2 :(得分:0)

当调用call()时,会创建一个新的堆栈帧,其中包含局部变量a的空间,该变量在执行call()期间具有生命周期。返回时,将删除堆栈帧及其本地变量和数据。尝试在函数外部使用此数据是未定义的,因为它在逻辑上不再存在。

如果你想在函数中声明a并在之后使用它,你需要分配它:

... 
int *a = malloc(sizeof int);
*a = 26;
return a;
... 

在完成使用后,请记住free()此指针。