以下代码是否正确?还是未定义的行为?
// myfile.c
static char x[10][10];
char* my_function() {
return x[0];
}
my_function
在共享库中使用,所以我认为在文件/编译单元之外访问返回值是不安全的(由于static
关键字)。
答案 0 :(得分:4)
变量x
在myfile.c之外对该名称不可见,但是因为它位于文件范围内,即它具有静态存储持续时间,所以它的生存期仍然是生存期整个程序。
因此在源文件之间返回指向静态数据的指针是有效的。
答案 1 :(得分:4)
从某种意义上说,即使您退出函数后,函数返回的x
存储指针仍将保持有效,因此该代码不是未定义的行为。换句话说,这不会产生在将指针返回到本地分配的自动存储时遇到的问题。
直接返回此指针可能会遇到的一个问题是,调用者可能不遵守x
的存储边界,而访问my_function()+sizeof(x)
之后的内存。可以通过提供读取和写入x
的函数而不返回指向它的指针来解决此问题。
注意:使用static
使得变量x
的名称不可访问,而无法访问。这个想法是让其他模块定义自己的变量x
,而不会造成名称冲突。
答案 2 :(得分:0)
“静态”变量有两种不同的作用。如果您将变量声明为函数内的静态 ,则即使在函数返回后,在函数内分配给它的内存仍可访问,例如:
#include <stdio.h>
char *func1()
{
static char hello[] = {"Hello, world!\0"};
return hello;
}
char *func2()
{
char goodbye[] = {"Goodbye!\0"};
return goodbye;
}
int main( int charc, char *argv[] )
{
printf( "%s\n", func1() );
printf( "%s\n", func2() );
}
对func1()的调用是有效的,因为在函数内部声明的变量“ hello”已设置为静态,因此即使函数返回后仍可访问。
对func2()的调用是未定义的行为,因为一旦函数将分配给“再见”的内存返回给操作系统。通常,您会遇到分段错误,程序将崩溃。
“静态”的另一件事是,当在文件级别将变量(或函数)声明为静态时,该变量(或函数)只能在该文件中访问。这是用于数据封装。
因此,如果我有带有以下代码的file1.c:
static *char hello()
{
static char hi[] = {"Hi!\0"};
return hi;
}
然后在file2.c中,我有:
#include <stdio.h>
extern char *hello(); //This lets the compiler know that I'm accessing a function hello() in another file
int main( int charc, char *argv[] )
{
printf( "%s", hello() );
return 0;
}
如果我用 gcc file1.c file2.c -o test
编译器会抱怨找不到hello()。