【问题标题】:What is the meaning of "p = (int[2]){*p};" line in C pointer?“p = (int[2]){*p};”是什么意思C指针中的行?
【发布时间】:2017-10-31 17:36:48
【问题描述】:

据我了解,我将变量a 的地址传递给函数int ffx1

在那之后,p = (int[2]){*p}; 这一行到底是什么意思?

int ffx1(int * p)
{
    p = (int[2]){*p};
    return(p[1]);
}

int main()
{
    int a = 1;
    a = ffx1(&a);
    printf("%d", a);

   return 0;
}

【问题讨论】:

  • (int[2]){*p} 是复合文字。 p = (int[2]){*p};int array[2] = { *p, 0 }; p = array;
  • 如果它是填充数组的复合文字,它没有为数组的第二个元素指定值,它是返回的可能是 UB 的元素
  • @AndyG 是的,请参阅 BLUEPIXY 的评论。
  • @coderredoc 终身
  • @coderredoc 虽然:C11 标准草案 n1570:6.5.2.5 复合文字 5 复合文字的值是由初始化列表初始化的未命名对象的值。如果复合文字出现在函数体之外,则该对象具有静态存储持续时间;否则,它具有与封闭块关联的自动存储持续时间。

标签: c pointers compound-literals


【解决方案1】:

对于int ffx1(int * p)p 是指向int 的指针。

(int[2]){*p} 是一个复合文字,它定义了一个由 2 组成的 int 数组。@BLUEPIXY 这个未命名的数组我们将称之为 X[2]。它的第一个元素的值为 *p,而下一个元素 int 将被初始化为零(第 6.7.9 节 21 和 10 节),因为它没有明确列出。

p = .... 将指针 p 分配给一个新值。在这种情况下,上面的数组X[]被转换为其第一次注册的地址或&X[0]

return p[1] 取消引用p,返回X[1]0 中的值。

【讨论】:

  • 谢谢。你的答案是对的。但是既然提到了 p[1] 和 int[2] 那么未命名数组的长度是多少? 2个还是3个?
  • @hago 未命名的数组,在这个答案中称为X[],由于(int[2]),由2个元素组成。
  • 谢谢。很好的解释。但这里不是写 p = (int[2]){*p};我可以写 int *q = (int[2]){*p};那么我的退货声明应该是什么?返回 p[1] 还是 q[1]?我猜 q[1] 对
  • @hago 是的,你可以写int *q = (int[2]){*p} 来避免改变局部变量preturn q[1] 会像上面那样工作。 return p[1] 将与传入的原始 p 一起使用,它不指向 2 个元素。
  • 你为什么提到“全零位模式”?在这种情况下恰好是真的,因为int 被定义为对于零值具有全零位模式;但是如果假设它是一个指针数组,那么另一个条目将获得空指针——不一定全为零。其他条目被初始化为{0}
【解决方案2】:

它是一个指向复合文字的指针

C11-§6.5.2.5 复合文字 (p9):

示例 2 相比之下,在

void f(void)
{
int *p;
/*...*/
p = (int [2]){*p};
/*...*/
}

p 被分配了两个数组的第一个元素的地址 整数,第一个具有先前由 p 指向的值和 第二,零。此复合文字中的表达式不必是 持续的。未命名对象具有自动存储期限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多