复合文字和指针
compound literals and pointers
以这种方式使用复合文字初始化指针是安全的,而且完全有可能吗?:
#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
我不太明白它是如何工作的,它和带有局部变量的初始化指针不一样吗?
如果我尝试打印:
printf("%s\n", ch);
什么都不打印。
在函数内声明的复合文字具有与其封闭块关联的自动存储持续时间 (C 2018 6.5.2.5 5),这意味着它的生命周期在块执行结束时结束。
在numbers
里面,*p = (int []){1, 2, 3};
把复合文字的地址赋值给*p
。当numbers
returns时,复合字面量不复存在,指针失效。在此之后,使用指针的程序的行为是不确定的。该程序可能能够打印值,因为数据仍在内存中,或者该程序可能打印不同的值,因为内存已更改,或者该程序可能因为它试图访问不可访问的内存而陷入困境,或者该程序的整个行为可能会改变以极端的方式,因为编译器优化将未定义的行为完全改变为其他行为。
这取决于复合文字的放置位置。
C17 6.5.2.5 §5
The value of the compound literal is that of an unnamed object initialized by the
initializer list. If the compound literal occurs outside the body of a function, the object
has static storage duration; otherwise, it has automatic storage duration associated with
the enclosing block.
也就是说,如果复合文字在本地范围内,它的工作方式与本地 variable/array 完全相同,并且 不 对 return 安全从函数指向它。
如果它是在文件范围内声明的,它就像任何其他具有静态存储持续时间的变量一样工作,您可以安全地 return 一个指向它的指针。但是,这样做可能表明设计有问题。此外,您还会遇到多线程应用程序中常见的线程安全问题。
以这种方式使用复合文字初始化指针是安全的,而且完全有可能吗?:
#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
我不太明白它是如何工作的,它和带有局部变量的初始化指针不一样吗?
如果我尝试打印:
printf("%s\n", ch);
什么都不打印。
在函数内声明的复合文字具有与其封闭块关联的自动存储持续时间 (C 2018 6.5.2.5 5),这意味着它的生命周期在块执行结束时结束。
在numbers
里面,*p = (int []){1, 2, 3};
把复合文字的地址赋值给*p
。当numbers
returns时,复合字面量不复存在,指针失效。在此之后,使用指针的程序的行为是不确定的。该程序可能能够打印值,因为数据仍在内存中,或者该程序可能打印不同的值,因为内存已更改,或者该程序可能因为它试图访问不可访问的内存而陷入困境,或者该程序的整个行为可能会改变以极端的方式,因为编译器优化将未定义的行为完全改变为其他行为。
这取决于复合文字的放置位置。
C17 6.5.2.5 §5
The value of the compound literal is that of an unnamed object initialized by the initializer list. If the compound literal occurs outside the body of a function, the object has static storage duration; otherwise, it has automatic storage duration associated with the enclosing block.
也就是说,如果复合文字在本地范围内,它的工作方式与本地 variable/array 完全相同,并且 不 对 return 安全从函数指向它。
如果它是在文件范围内声明的,它就像任何其他具有静态存储持续时间的变量一样工作,您可以安全地 return 一个指向它的指针。但是,这样做可能表明设计有问题。此外,您还会遇到多线程应用程序中常见的线程安全问题。