2013-11-22 39 views
1

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。 so ptr = & a = -18。然后clrscr清除它....但如何*ptr被打印为输出?我的意思是地址不能是负数(-18)。

+2

这是未定义的行为,任何事情都可能发生,26,30,世界末日等 –

+0

这意味着-18作为地址是允许的? – user3018725

+2

@ user3018725您不打印地址,而是打印地址的内容。 – Barmar

回答

1

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

如果你需要从C函数返回一个指针,你需要在动态存储要么分配的内存块,像这样:

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

,或者使用一个指向静态分配的块,像这个:

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

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

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; 
} 
0

call()被调用时,一个新的堆栈帧与用于局部变量a,其具有call()执行期间其寿命空间创建。当它返回时,堆栈框架将与其局部变量和数据一起被删除。试图在函数外使用这些数据是未定义的,因为它不再存在,逻辑上。

如果你想声明a一个函数里,之后使用它,你需要给它分配:

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

记住free()这个指针你使用它完成之后。