【发布时间】:2014-08-25 19:48:02
【问题描述】:
我写了这个简单的程序
#include <stdio.h>
int main(void)
{
int array[10];
printf("sizeof(array): %lu\n", sizeof(array));
printf("sizeof(&array): %lu\n", sizeof(&array));
printf("array: %p\n", array);
printf("&array: %p\n", &array);
printf("value: ");
scanf("%d", array); // 1
//scanf("%d, &array"); // 2
}
输出:
sizeof(array): 40
sizeof(&array): 8
array: 0x7fffaab6f480
&array: 0x7fffaab6f480
value: 10
当我使用 1 时它会编译。但是,当我使用 2!
我收到此编译警告
warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type
‘int (*)[10]’ [-Wformat=]
scanf("%d", &array);
^
虽然array 和&array 具有相同的值,但它们在我的系统上具有不同的大小(分别为40 和8)。
另一方面,这段代码
int array[10];
fread(&array, x, y, z);
编译并完美运行
int array[10];
fread(array, x, y, z);
我在警告消息中注意到&array 的类型为int (*)[10]。这是什么意思?
我也相信fread() 没有问题,因为它接受void *,但是scanf() 呢?它如何区分指针类型?
为什么不将array 视为&array,即使它们实际上具有相同的值?
【问题讨论】:
-
警告不是错误。
-
@FelixFrank 或“帮助理解差异的简单示例,这在更复杂的情况下很重要”
标签: c arrays pointers scanf fread