小编Mas*_*feo的帖子

C中的复合文字存储持续时间

第一个问题:)

我正在“自己”学习编程,阅读KNKing 的“C 编程:一种现代方法”。在第 18 章 - 声明的问答部分,有一个关于为什么选择语句和迭代语句(以及它们的“内部”语句)在 C99 中被认为是块的问题。在对答案进行了简短的介绍后,他说:

[...] C99 标准规定,如果复合文字出现在函数体外,则由复合文字表示的对象具有静态持续时间。否则,它具有自动存储期限;结果,对象占用的内存在复合文字出现的块的末尾被释放[...]

我想我明白了。我试图从一个函数返回一个指向复合文字的指针,实际上输出是错误的(或者我猜是未定义的)。我的问题如下; 他举了这个例子:

/* Example 2 - if statements with braces */

double *coefficients, value;

if(x){
    coefficients = (double[3]) {1.5, -3.0, 6.0};
}else{
    coefficients = (double[3]) {4.5, 1.0, -3.5};
}
value = evaluate_polynomial(coefficients);
Run Code Online (Sandbox Code Playgroud)

接着是这样的解释:

每个复合文字都会导致创建一个对象,但该对象仅存在于由包含文字出现的语句的大括号形成的块中。到时候evaluate_polynomial被调用,coefficients指向一个不再存在的对象。结果:未定义的行为。

当我在我的计算机中尝试完全相同的代码时(我在 Linux VM 中使用 GCC),我总是得到正确的输出。一旦“控制流”退出if块,文字似乎不会被释放。

有人可以详细说明一下吗?

谢谢。

c storage scope c99 compound-literals

5
推荐指数
1
解决办法
123
查看次数

标签 统计

c ×1

c99 ×1

compound-literals ×1

scope ×1

storage ×1