一道C面试题引发的思考
来源:互联网 发布:阿里云内容禁止访问 编辑:程序博客网 时间:2024/05/17 03:16
char *strA()
{
char str[] = "hello word ";
return str;
}
很明显出错了,返回指向局部变量的指针。
这个str里存的地址 是函数strA栈桢里 "hello word "的首地址
函数调用完成 栈桢恢复到调用strA之前的状态
ebp esp 被重置
堆栈 "回缩 "
strA 栈桢不再属于应该访问的范围
存于strA栈桢里的 "hello word "当然也不应该访问了
正确的写法:
const char* strA()
{
char* str = "hello word";
return str;
}
char* strA()
{
static char str[] = "hello word";
return str;
}
char* strA()
{
char* str = new char[128];
strcpy(str, "hello word");
return str;
}
关于char* str = "hello word";
一般来讲,修改这样的串是不允许的(有的编译器可以修改). "hello word "在全局数据区
---------------
Heap ¦
---------------
Stack ¦
---------------
Const ¦(字符串常量通常放在data-const区中)
data--Common ¦
Data ¦
---------------
Code ¦
---------------
既然是全局,那在strA之外自然也能访问的拉,注意与在栈里的串的区别
可以认为这是C++语法上的一个歧义,不过也可以认为是一种方便.
char c[] = "hello world ";
是分配一个局部数组.
char *c = "hello world ";
是分配一个全局数组.
- 一道C面试题引发的思考
- 由一道面试题引发的思考
- 百度一道面试题引发的思考
- 一道面试题引发的思考
- 一道360面试题引发的思考
- 一道360面试题引发的思考
- 一道面试题引发的思考
- 一道面试题引发的思考
- 一道js面试题引发的思考
- 一道面试题引发的思考
- (续)一道面试题引发的思考
- 一道 JS 面试题引发的思考
- 一道面试题引发的思考
- 一道面试题引发的有关随机数的思考(1)
- 一道面试题引发的有关随机数的思考(2)
- 一道面试题引发的有关随机数的思考(3)
- 一道面试题引发的有关随机数的思考(4)
- 一道面试题引发的有关随机数的思考(5)
- no_redir.c
- no_space.c
- no_stdio.c
- no_temp.cpp
- ntensity.c
- 一道C面试题引发的思考
- microwindows 中文显示问题的解决
- number.c
- num_els.c
- oct_hex.c
- 修成JAVA高手的基本素养
- odd_even.c
- ok_recur.c
- Linux下最精致最拟真的仿MAC程序下载