复合文字和指针

Pet*_*nko 1 c pointers compound-literals

以这种方式使用复合文字来安全地初始化指针是完全可能的吗?:

#include <stdio.h>
#include <string.h>

void numbers(int **p)
{
        *p = (int []){1, 2, 3};
}

void chars(char **p)
{
        *p = (char[]){'a','b','c'};
}

int main()
{
    int *n;
    char *ch;

    numbers(&n);
    chars(&ch);
    printf("%d %c %c\n", n[0], ch[0], ch[1]);
}
Run Code Online (Sandbox Code Playgroud)

输出:

1 a b
Run Code Online (Sandbox Code Playgroud)

我不明白它是如何工作的,它是否与带有局部变量的init指针不一样?

如果我尝试打印:

printf("%s\n", ch);
Run Code Online (Sandbox Code Playgroud)

它什么都没打印.

Eri*_*hil 5

在函数内声明的复合文字具有与其封闭块相关的自动存储持续时间(C 2018 6.5.2.5 5),这意味着它的生命周期在块的执行结束时结束.

在里面numbers,*p = (int []){1, 2, 3};将复合文字的地址指定给*p.当numbers返回时,存在的化合物字面停止,指针是无效的.在此之后,使用指针的程序的行为是未定义的.程序可能能够打印值,因为数据仍在内存中,或者程序可能会打印不同的值,因为内存已更改,或者程序可能因为尝试访问无法访问的内存而陷阱,或者程序的整个行为可能会更改因为编译器优化将未定义的行为完全改变为其他东西.