C 中的 static const char* VS const char*
static const char* VS const char* in C
C语言中的const char*
和static const char*
有什么区别?
我认为Difference between static const char* and const char*的答案是错误的
确实,const char*
个元素放在程序的.rodata
段,否则下面会导致段错误:
const char* f() {
const char* hello = "hello";
return hello;
}
int main() {
const char* hello_after = f();
printf("%s\n", hello_after);
}
的确,因为那个代码有效,f
返回的指针仍然指向存活的数据,这表明数据没有分配到堆栈上,而是存储在.rodata
中。
但是,在我看来 const char*
和 static const char*
就 GCC 而言是相同的东西。
但是,为什么 const int*
和 static const int*
的行为不一样?这是一个例外,在 GCC 中硬编码,仅针对类型 char
然后 const
和 static const
应该相同吗?
非常感谢您的帮助!
在此函数声明中
const char* f() {
const char* hello = "hello";
return hello;
}
指针 hello 指向具有静态存储持续时间的字符串文字 "hello"。也就是说,它不是具有静态存储持续时间的指针,而是具有静态存储持续时间的指向文字。在函数的每次调用中,指针都会重新初始化。
如果你将函数声明为
const char* f( ) {
static const char* hello = "hello";
return hello;
}
那么在这种情况下,指针本身具有静态存储持续时间。它在程序获得控制之前被初始化一次,并且它的值在函数调用之间保持。
例如考虑这个演示程序。
#include <stdio.h>
const char* f( int i )
{
static const char* hello = "hello";
if ( i == 1 ) hello = "bye";
else if ( i == -1 ) hello = "hello";
return hello;
}
int main(void)
{
puts( f( 0 ) );
puts( f( 1 ) );
puts( f( 0 ) );
return 0;
}
它的输出是
hello
bye
bye
最初指针 hello 是由字符串文字 "hello" 初始化的。
然后由于这个电话
puts( f( 1 ) );
它的值被改变了。现在它指向字符串文字 "bye".
第三次调用
puts( f( 0 ) );
指针保留上次调用函数时分配给它的值。
这是因为指针有静态存储期限。
C语言中的const char*
和static const char*
有什么区别?
我认为Difference between static const char* and const char*的答案是错误的
确实,const char*
个元素放在程序的.rodata
段,否则下面会导致段错误:
const char* f() {
const char* hello = "hello";
return hello;
}
int main() {
const char* hello_after = f();
printf("%s\n", hello_after);
}
的确,因为那个代码有效,f
返回的指针仍然指向存活的数据,这表明数据没有分配到堆栈上,而是存储在.rodata
中。
但是,在我看来 const char*
和 static const char*
就 GCC 而言是相同的东西。
但是,为什么 const int*
和 static const int*
的行为不一样?这是一个例外,在 GCC 中硬编码,仅针对类型 char
然后 const
和 static const
应该相同吗?
非常感谢您的帮助!
在此函数声明中
const char* f() {
const char* hello = "hello";
return hello;
}
指针 hello 指向具有静态存储持续时间的字符串文字 "hello"。也就是说,它不是具有静态存储持续时间的指针,而是具有静态存储持续时间的指向文字。在函数的每次调用中,指针都会重新初始化。
如果你将函数声明为
const char* f( ) {
static const char* hello = "hello";
return hello;
}
那么在这种情况下,指针本身具有静态存储持续时间。它在程序获得控制之前被初始化一次,并且它的值在函数调用之间保持。
例如考虑这个演示程序。
#include <stdio.h>
const char* f( int i )
{
static const char* hello = "hello";
if ( i == 1 ) hello = "bye";
else if ( i == -1 ) hello = "hello";
return hello;
}
int main(void)
{
puts( f( 0 ) );
puts( f( 1 ) );
puts( f( 0 ) );
return 0;
}
它的输出是
hello
bye
bye
最初指针 hello 是由字符串文字 "hello" 初始化的。
然后由于这个电话
puts( f( 1 ) );
它的值被改变了。现在它指向字符串文字 "bye".
第三次调用
puts( f( 0 ) );
指针保留上次调用函数时分配给它的值。
这是因为指针有静态存储期限。