Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 复合文字和指针_C_Pointers_Compound Literals - Fatal编程技术网

C 复合文字和指针

C 复合文字和指针,c,pointers,compound-literals,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; numb

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

#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]);
}
我不太明白它是如何工作的,它和带局部变量的init指针不一样吗

如果我尝试打印:

printf("%s\n", ch);

它不打印任何内容。

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


内数,*p=int[]{1,2,3};将复合文字的地址指定给*p。当数字返回时,复合文字不再存在,指针无效。在此之后,使用指针的程序的行为是未定义的。由于数据仍在内存中,程序可能能够打印值,或者由于内存已更改,程序可能打印不同的值,或者由于试图访问不可访问的内存,程序可能会陷入陷阱,或者,由于编译器优化将未定义的行为完全更改为其他行为,程序的整个行为可能会发生剧烈的变化。

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


内数,*p=int[]{1,2,3};将复合文字的地址指定给*p。当数字返回时,复合文字不再存在,指针无效。在此之后,使用指针的程序的行为是未定义的。由于数据仍在内存中,程序可能能够打印值,或者由于内存已更改,程序可能打印不同的值,或者由于试图访问不可访问的内存,程序可能会陷入陷阱,或者程序的整个行为可能会发生剧烈的变化,因为编译器优化将未定义的行为完全更改为其他行为。

这取决于复合文字的位置

C17 6.5.2.5§5

复合文字的值是由初始化的未命名对象的值 初始化列表。如果复合文字出现在函数体之外,则对象 具有静态存储时间;否则,它将具有与关联的自动存储持续时间 封闭块

也就是说,如果复合文字位于局部范围,它的工作方式与局部变量/数组完全相同,从函数返回指向它的指针是不安全的


但是,如果它是在文件范围内声明的,则它的工作方式与具有静态存储持续时间的任何其他变量一样,并且您可以安全地返回指向它的指针。然而,这样做可能表明设计有问题。此外,在多线程应用程序中还会遇到常见的线程安全问题。

这取决于复合文本的位置

C17 6.5.2.5§5

复合文字的值是由初始化的未命名对象的值 初始化列表。如果复合文字出现在函数体之外,则对象 具有静态存储时间;否则,它将具有与关联的自动存储持续时间 封闭块

也就是说,如果复合文字位于局部范围,它的工作方式与局部变量/数组完全相同,从函数返回指向它的指针是不安全的


但是,如果它是在文件范围内声明的,则它的工作方式与具有静态存储持续时间的任何其他变量一样,并且您可以安全地返回指向它的指针。然而,这样做可能表明设计有问题。此外,在多线程应用程序中,您还会遇到常见的线程安全问题。

如果chars包含*p=abc;这会有不同的表现吗?@TimRandall是的。字符串文字是一种特殊情况,因为它们保证始终具有静态存储持续时间C17 6.4.5/6。字符串文字是C语言中的主要表达式,是该语言词汇元素的一部分。复合文字更应该被视为通过特殊运算符声明的变量。不过,它们与字符串文字有一些共同之处,因此每个字符串或复合文字不需要指定唯一的对象。允许使用优化技术来节省内存,比如字符串池;这会有不同的表现吗?@TimRandall是的。字符串文字是一种特殊情况,因为它们保证始终具有静态存储持续时间C17 6.4.5/6。字符串文字是C语言中的主要表达式,是该语言词汇元素的一部分。复合文字更应该被视为通过特殊运算符声明的变量。不过,它们与字符串文字有一些共同之处,因此每个字符串或复合文字不需要指定唯一的对象。允许使用优化技术来节省内存,例如字符串池。
printf("%s\n", ch);