我一直想知道为什么以下代码被剪掉了:
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)
吗?
我将很感激我能从中获得的任何知识。我已经浏览了一堆具有相同标题的线程,但无法找到令人满意的答案。
答案 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'被转换为类型为'指向类型的指针'的表达式,指向数组对象的初始元素而不是左值。如果数组对象具有寄存器存储类,则行为为未定义。