29课后作业的一些些疑问
本帖最后由 sswy 于 2018-8-12 18:52 编辑#include <stdio.h>
void func(int b[]);
void func(int b[])
{
printf("%d\n", b);
}
int main(void)
{
int a = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
func(a);
return 0;
}
答案是:9
此代码进入VS2017编译是不通过的,但是其它编译器可以过, 要把b[]才可通过,那是否这道题就是错误的呢?
如果这题是正确的,我是否可以把数组指针,随意指向数组,并可随意指定跨度呢?
比如这样int (*aa)=&a 报错, 因为a表示,数组第一个元素(这里a跨度4个元素,sizeof(a)==int*4),而 &a表示的是整个数组,这里的&a(&a跨度4个元素)因为和数组指针跨度不匹配.导致“左右类型不一致”,23课后作业已经说明
但是这样写法在其它编译器又可以通过 int (*aa)=&a {:10_292:}
这道题到底是对是错?还是只是编译器要求规格要求不一样而已,估计是编译器问题,那么如何设置才能让VS编译也通过呢?
本帖最后由 qq1242009750 于 2018-8-12 19:49 编辑
其实这题说明了 数组 指针要对应二维数组不对应的话读取的数据可能不在预期之内,且有些编译器会报错。
像这题的话 int a[]就是明显和原来的二位数组不匹配
虽然他也可以容纳这个二维数组但是逻辑改变了
变成了由3个元素的一维数组组成的二维数值了
因此可以发现func函数里b 读取的值是 12
{:5_102:}
人造人 发表于 2018-8-12 18:56
哈哈哈,老师你的也出waring了,反正我的过不了,估计哪里没有设置,但是我发现,VS这种检测跨度匹配是一种很好的方式,强制编写者匹配跨度,也对编写者养成良好习惯{:10_333:} qq1242009750 发表于 2018-8-12 18:55
其实这题说明了指针数组要对应二维数组不对应的话读取的数据可能不在预期之内,且有些编译器会报错。
...
是的老师,非常感谢{:10_334:} 老师你可能打错字了,是数组指针嘻嘻 sswy 发表于 2018-8-12 19:04
哈哈哈,老师你的也出waring了,反正我的过不了,估计哪里没有设置,但是我发现,VS这种检测跨度匹配是一 ...
你的编译无法通过吗?
截图看看
人造人 发表于 2018-8-12 19:33
你的编译无法通过吗?
截图看看
人造人 发表于 2018-8-12 19:33
你的编译无法通过吗?
截图看看
不过,都没点调试,已经现红字了{:10_266:} 人造人 发表于 2018-8-12 19:33
你的编译无法通过吗?
截图看看
也蛮好的~23课后作业就说,应该果断报错。
规范书写也严谨点也是好事。
过了会让很多人以为array和&array是一回事,并且说不定以后会出什么BUG。
所以我还是坚持,数组指针指向数组的跨度一样,
这样写,也会让自己明白,数组指针做为函数参数,跨度也要一样{:10_324:} sswy 发表于 2018-8-12 20:30
这是C语言不是C++
所以后缀应该是.c,不是.cpp
人造人 发表于 2018-8-12 21:53
这是C语言不是C++
所以后缀应该是.c,不是.cpp
我居然没注意改后缀,谢谢老师
但是还是会警告就是了
严重性 代码 说明 项目 项目级别 路径 文件 行 列 类别 源 禁止显示状态 工具
警告 C4048 “int (*)”和“int ”数组的下标不同 hansu_chansu 1 e:\vs_practice\hansu_chansu\hansu_chansu e:\vs_practice\hansu_chansu\hansu_chansu\hansu_chansu.c 18 1 生成 CL
sswy 发表于 2018-8-12 22:41
我居然没注意改后缀,谢谢老师
但是还是会警告就是了
嗯,有警告就对了
页:
[1]