假设我有一个以这种方式返回 C 字符串的简单函数:
const char * getString()
{
const char * ptr = "blah blah";
return ptr;
}
我这样从 main() 调用 getString() :
const char * s = getString();
1)根据gdb,变量ptr存储在栈上,但是ptr指向的字符串却没有:
(gdb) p &ptr
$1 = (const char **) 0x7fffffffe688
(gdb) p ptr
$2 = 0x4009fc "blah blah"
这是否意味着“blah blah”不是getString() 中的局部变量?
我想如果它是一个局部变量,我将无法将它传递给我的 main() 函数......但如果不是,它存储在哪里?在堆上?这是操作系统每次遇到字符串时都会实现的“一种”动态内存分配,还是什么?
2)如果我使用数组而不是指针,这样:
const char *getString2()
{
const char a[] = "blah blah blah";
return a;
}
编译器警告我:
warning: address of local variable ‘a’ returned
(当然程序可以编译,但它不起作用)。
实际上,如果我问 gdb,我会得到
(gdb) p &a
$2 = (const char (*)[15]) 0x7fffffffe690
但我认为const char * ptr和const char a[]基本上是一回事。看起来他们不是。
我错了吗?这两个版本之间究竟有什么区别?
谢谢!