从不兼容的指针类型警告初始化,在堆栈上分配一个数组

时间:2018-02-08 20:27:42

标签: c arrays pointers

我一直想知道为什么以下代码被剪掉了:

Assignment/initialization from incompatible pointer type

会导致int[n]警告,从而导致运行时错误。

如果这不是正确的语法,我如何声明指向n 的指针,其中int *x = malloc(10 * sizeof(int))在运行时已知?

如果这听起来像是不好的做法,为什么?我应该使用user_id <- c(1:5) name <- c("a","b","c","d","e") age <- c(20,23,44,21,32) gender <- c("m","f","","", "m") df <- data.frame(user_id, name, age, gender, stringsAsFactors = FALSE) 吗?

我将很感激我能从中获得的任何知识。我已经浏览了一堆具有相同标题的线程,但无法找到令人满意的答案。

1 个答案:

答案 0 :(得分:2)

指向10 int元素数组的引用 - int (*ptr)[10]当然不是int**。因此类型不匹配。当x用作&的操作数时,x不会衰减为指针(int*)。数组对象的地址为int(*)[10]而非int**

这是一种应用自己的做法。 int *x = malloc(..)与生命周期,存储持续时间及其使用情况相比,与int x[10]完全不同。

数组不是指针 - 在大多数情况下,它被转换为一个(数组衰减) - 但这并不会使它成为指针。例如,当数组用作&sizeof运算符的操作数时,它不会衰减为指针。

标准C11 N1570说这个数组衰减,因为它是这个问题本身使用的核心思想,它的答案会提到它。来自§6.3.2.1¶3

  

除非它是sizeof运算符,_Alignof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,是一个表达式类型'array of type'被转换为类型为'指向类型的指针'的表达式,指向数组对象的初始元素而不是左值。如果数组对象具有寄存器存储类,则行为为未定义。