C语言中以字符串为返回值的函数的问题,困扰我好几天了
发布网友
发布时间:2022-04-23 06:45
我来回答
共4个回答
热心网友
时间:2022-06-16 22:18
野指针的含义:超出生命周期的指针,包括函数内局部数据的指针(static修饰数据除外,它不在栈上)和已经被释放了的动态分配内存区。
char *Getstr(void)
{
char s[80];
scanf("%s",s);
printf("s = %p\n",s);
return s;
}
这个函数,是将栈内局部变量的地址返回给调用者,调用者拿到的指针属于典型的超出生命周期的指针,对它的使用会不会引起错误,依赖于进一步的操作,本身行为就是不可预期的。
可以认为:使用strcpy和printf并没有破坏这个内存区域,即没有对这部分内存做修改,因此运行可以得到你期待的结果。但puts的运行修改了这部分内存区,导致你看到的都是乱码。
避免野指针带来的不确定性:
你可以使用
char *Getstr(void)
{
static char s[80];
scanf("%s",s);
printf("s = %p\n",s);
return s;
}
用这个函数,你的所有逻辑都不变。
或者
char *Getstr(void)
{
char *s = malloc(80);
scanf("%s",s);
printf("s = %p\n",s);
return s;
}
要记得在这个调用后得到的ptr,一定要用free(ptr)。
热心网友
时间:2022-06-16 22:18
一、不要使用局部变量作为返回值来使用!因为,子函数一结束,局部变量就被释放。
当有其它程序用到该内存数据时,数据就会发生变化,
而若没有人使用,则数据不会发生变化。
二、一定要使,则将局部变量定义成静态变量,相当于定义一个全局变量:
char *Getstr(void)
{
static char s[80]; //加上static
scanf("%s",s);
printf("s = %p\n",s);
return s;
}
热心网友
时间:2022-06-16 22:19
子函数结束之后所占的内存被释放掉意思是“这片内存空间从释放掉之后就可以再次被其他程序使用”,但是这片空间里的内容有没有改变就不好说了,程序输出正确的结果只能说明在你函数返回到调用fputs这段时间里这片内存没有被重新赋其他的值。虽然结果是正确的,语法上也没有错误,但是这种写法是不对的!只要是被释放掉的内存空间绝对不可以再次引用!
热心网友
时间:2022-06-16 22:19
#include <stdio.h>
#include <string.h>
char *Getstr(void);
int main()
{
char str[80];
printf("Input a string");
strcpy(str,Getstr());//没有直接用Getstr()的返回值,而是把Getstr()的内容复制给str
puts(str);
return 0;
}
char s[80];//声明为全局变量
char *Getstr(void)
{
scanf("%s",s);
printf("s = %p\n",s);
return s;
}