返回指向静态(外部函数)数组的指针

时间:2018-08-17 16:17:30

标签: c

以下代码是否正确?还是未定义的行为?

// myfile.c
static char x[10][10];

char* my_function() {
    return x[0];
}

my_function在共享库中使用,所以我认为在文件/编译单元之外访问返回值是不安全的(由于static关键字)。

3 个答案:

答案 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()。