c - 复合文字和指针
问题描述
以这种方式使用复合文字初始化指针是安全的,而且完全有可能?:
#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]);
}
输出:
1 a b
我不明白它是如何工作的,它与带有局部变量的 init 指针不一样吗?
如果我尝试打印:
printf("%s\n", ch);
什么都没有打印。
解决方案
在函数内部声明的复合文字具有与其封闭块关联的自动存储持续时间 (C 2018 6.5.2.5 5),这意味着它的生命周期在块执行结束时结束。
在内部numbers
,*p = (int []){1, 2, 3};
将复合文字的地址分配给*p
. 返回时numbers
,复合文字不再存在,并且指针无效。在此之后,使用指针的程序的行为是未定义的。程序可能会打印值,因为数据仍在内存中,或者程序可能会打印不同的值,因为内存已更改,或者程序可能会因为尝试访问不可访问的内存而陷入陷阱,或者程序的整个行为可能会发生变化以剧烈的方式,因为编译器优化将未定义的行为完全改变了。
推荐阅读
- css - @supports 不在 FF 和 Chrome 中使用
- android - 片段交互
- prestashop - PrestaShop Multistore API not working for additional stores
- android - 从 LifeCycleService 观察 LiveData
- android - 将可绘制文件夹从“大”重构为“sw123dp”
- sql - convert existing local datetime entries to UTC
- ios - Undefined symbols for architecture x86_64: in Xcode 9.4
- python - 如何在条件下从数据框中删除选定的行
- git - Rundeck:使用 ssh 在远程服务器中运行命令
- python - 索引在熊猫中未被识别