从函数返回指向复合文字的指针安全吗?

我知道函数的局部变量在函数返回后被释放,而mallocd内存是一个例外.然而,当我试图返回指向复合文字的指针时,编译器没有给出任何警告.这是否意味着这样做是安全的?

我用gcc -Wall -o test test.c

以下代码编译时没有任何警告,并输出20

#include <stdio.h>

struct test {
    int item;
    struct test *next;
} struct_1 = { .item = 10, .next=NULL };

struct test * returnStruct(){
    struct test * structPointer = (& ((struct test) { .item = 20, .next = NULL }));
    return(structPointer);
}

int main(){
    struct_1.next = returnStruct();
    printf("%d", (struct_1.next)->item);
    return(0);
}

但此代码会导致警告

#include <stdio.h>

int * testr(){
    int i = 568;
    return(&i);
}

int main(){
    printf("%d", *testr());
    return(0);
}
warning: address of stack memory associated with local variable 'i' returned [-Wreturn-stack-address]
        return(&i);
                ^
1 warning generated.

另外,如果复合文字在函数返回后没有被释放,这是否意味着我需要对函数中的所有复合文字调用free

推荐答案

从函数返回指向复合文字的指针安全吗?

不是的.复合文字与声明它们的块具有相同的存储持续时间.因此,如果它们是在函数中声明的,则它们具有自动存储持续时间,您不应该返回它们,原因与您不应该返回指向任何其他局部变量的指针的原因相同.


以下代码编译时没有任何警告

GCC断了诊断法,不能信对于-Wall -O3,我会收到这样的警告:

warning: function returns address of local variable [-Wreturn-local-addr]
return(structPointer);

没有-O3,我就做不到.还有一个GCC的虫子.似乎它也已经存在了很久.


至于如何解决这个问题,也许在本例中只需按值返回 struct .这通常不是一个好主意,因为 struct 通常很大,但它的工作方式与memcpy差不多.

C++相关问答推荐

生成C代码时自动复制/生成' tmwtypes.h '依赖项

是否可以在C中进行D3 D12申请?

%p与char* 等组合缺少的GCC Wform警告

GCC创建应用于移动项的单独位掩码的目的是什么?

在Rust和C之间使用ffi时如何通过 struct 中的[U8;1]成员传递指针

如何在CANbus RX/TX FIFO起始地址寄存器(ATSAME 51)的特定地址初始化数组?

为什么我可以在GCC的标签后声明变量,但不能声明Clang?

关于";*(++p)->;t";、&++p->;t";和&q;++*p->;t";的问题

将返回的char*设置为S在函数中定义的字符串文字可能会产生什么问题?

在编写代码时,Clion比vscode有更多的问题指示器

使用%f格式说明符打印整数值

在C程序中使用Beaglebone Black UART的问题

为什么GCC 13没有显示正确的二进制表示法?

Matlab/Octave对conv2函数使用哪种方法?

如果类型是新的,offsetof是否与typeof一起工作?

在哪里可以找到叮当返回码的含义?

函数指针作为函数参数 - 应该使用 const 吗?

根据输入/输出将 C 编译过程分为预处理、编译、汇编和链接步骤

是什么阻止编译器优化手写的 memcmp()?

使用复合文字数组初始化的指针数组