
C关于局部指针生存周期的问题
对于一个函数char*getstr(void){chars[]="hello,world!";returns;}当s返回的时候s是不确定的,因为已经被释放了。但是书上写,...
对于一个函数
char *getstr( void )
{
char s[] = "hello,world!";
return s;
}
当s返回的时候s是不确定的,因为已经被释放了。
但是书上写,如果用指针就是安全的。如下:
char *getstr( void )
{
char *s = "hello world!";
return s;
}
我的问题是难道指针超出作用域就不会被释放吗?
虽然我知道str所指向的是静态空间的const char*。
但是当函数返回后。难道这个指针和这些字符都不会释放掉吗?
按我所想,我认为如下才是安全的。
static char *str = "hello world";
请各位指正一下。谢谢谢谢 展开
char *getstr( void )
{
char s[] = "hello,world!";
return s;
}
当s返回的时候s是不确定的,因为已经被释放了。
但是书上写,如果用指针就是安全的。如下:
char *getstr( void )
{
char *s = "hello world!";
return s;
}
我的问题是难道指针超出作用域就不会被释放吗?
虽然我知道str所指向的是静态空间的const char*。
但是当函数返回后。难道这个指针和这些字符都不会释放掉吗?
按我所想,我认为如下才是安全的。
static char *str = "hello world";
请各位指正一下。谢谢谢谢 展开
展开全部
char s[] = "aaaa";
s[]是在栈空间分配的。
开辟了一串连续空间,把字符存入。
当离开作用域时s成为无效。
char *s = "aaaa";
*s同样是在栈上分配的。
这个空间内的地址是指向常量区的一个字符串。
当离开作用域时s同样无效。
至于为什么返回指针是安全的,我在这里说一下。
返回局部变量本来说来是有巨大隐患的。
但是这里返回的是一个常量区字符的地址。
上层函数接收后仍然可以访问那块常量区的字符串。
这个常量区的内容只有程序结束后才又操作系统回收。
另外静态区是全局变量,静态变量呆的地方。
就这个程序可以这样实验一下。
char *getstr( void )
{
char s[] = "abcdefg";
printf("\'%p\'\n" , s ); //查看s的第一个字符的地址。即'a'的地址
printf("\'%c\'\n" , *s ); //查看s的第一个字符
return s;
}
int main( void )
{
printf("getstr() is \'%s\'\n" , getstr() ); //查看返回的字符串
//你这里可以看到返回的字符串很可能已经面目全非了。
printf("\'%c\'" , *( ( int* )( 0x0012ff20 ) ) );
//直接访问内存地址,0x0012ff20是我机器上输出的地址。
//你这里可以改成getstr函数输出的那个地址来查看已释放的第一个字符。
getch();
return 0;
}
s[]是在栈空间分配的。
开辟了一串连续空间,把字符存入。
当离开作用域时s成为无效。
char *s = "aaaa";
*s同样是在栈上分配的。
这个空间内的地址是指向常量区的一个字符串。
当离开作用域时s同样无效。
至于为什么返回指针是安全的,我在这里说一下。
返回局部变量本来说来是有巨大隐患的。
但是这里返回的是一个常量区字符的地址。
上层函数接收后仍然可以访问那块常量区的字符串。
这个常量区的内容只有程序结束后才又操作系统回收。
另外静态区是全局变量,静态变量呆的地方。
就这个程序可以这样实验一下。
char *getstr( void )
{
char s[] = "abcdefg";
printf("\'%p\'\n" , s ); //查看s的第一个字符的地址。即'a'的地址
printf("\'%c\'\n" , *s ); //查看s的第一个字符
return s;
}
int main( void )
{
printf("getstr() is \'%s\'\n" , getstr() ); //查看返回的字符串
//你这里可以看到返回的字符串很可能已经面目全非了。
printf("\'%c\'" , *( ( int* )( 0x0012ff20 ) ) );
//直接访问内存地址,0x0012ff20是我机器上输出的地址。
//你这里可以改成getstr函数输出的那个地址来查看已释放的第一个字符。
getch();
return 0;
}

2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询