在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)。
答案 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()
此指针。