免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: pmerofc
打印 上一主题 下一主题

[C] 有多少C程序员认为这是错误的写法 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2012-05-11 22:32 |只看该作者
回复 30# pmerofc


    一同学从 pascal 转 c 发现不允许偏移很不爽 遂发明此写法 ..

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
32 [报告]
发表于 2012-05-11 22:38 |只看该作者
回复 31# hbmhalley

这都什么人……
拖出去糟踏了

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
33 [报告]
发表于 2012-05-11 22:39 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
34 [报告]
发表于 2012-05-11 22:40 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
35 [报告]
发表于 2012-05-11 22:58 |只看该作者
回复 18# pmerofc

姑且就先算它越界吧……


但这其实,就和C89里使用:

  1. struct T {
  2.       ...
  3.       char s[1];
  4. };
复制代码
差不多……  K&R是怎么评论来着?与C亲密接触?


还有hbmhalley提到的pascal的问题。
有一本叫《数值算法》的书的C版本,就用过类似的技巧:

  1. T* p = (T*)malloc(n * sizeof *p);
  2. --p;
复制代码
然后就可以用1作为其实下标了……  全书的代码都是这么搞的……

并且,好像是在附录里作者也提到了这事。
1. 这肯定是违法C语言的
2. 但这技巧在他测试过的平台(记得不少)都没出过问题……


还有前段时间,就在CU论坛里有一个帖。
我搜了半天无果,但内容大致是:

  1. typedef struct {
  2.       U first[N];
  3.       ...
  4. } T;

  5. T* p = 0;
  6. if (p.first) { ... } else { ... }
复制代码
其实这题目相对那些脑残面试题来说还挺好的。基本又是一只脚踩在C的钢丝上,另一只脚悬空的状态……



也就是说,即使它们违反了某些规定,但实在也想不出会有什么危害 —— 除非编译器故意整人。

比如二维数组,还有C89里模仿flexible的技巧,它们确实是一整块continuous storage,即使越界了,后面空间肯定有,指针也不会溢出。
除非编译器要去加上边界检查,那就……

BTW: 整个二维数组(甚至任何object)都可以取地址再转换为char*最后一个一个访问。 你说这数组的长度是多少呢?
我觉得在连续存储的问题上,C语言有时候用的the same array这一术语其实是想指一块连续内存,而不是真的指它是某种类型的某长度的数组。
这块内存可以当作任何类型来解释,只要大小、对齐满足需要即可。
再比如malloc( N*M*sizeof(float) ) 又该怎么解释呢? 将它解释为一个N*M的二维数组也行, 解释为一个长度是N*M的一维数组也可以。 为什么对自动变量就不行了呢?

至于 p.first , 即使违反了C的规定, 也想不出会产生错误的情况。

只有那个 --p 让下标从1开始, 也许会产生溢出问题。

论坛徽章:
0
36 [报告]
发表于 2012-05-11 23:03 |只看该作者
void *p = malloc(4 * 5 * sizeof(int));
int *arr1 = (int*)p;    // 这时候当成 int [20] 来用
int (*arr2)[5] = (int(*)[5])p;  // 这时候当成 int [4][5] 来用

问题:
同样大小、同样是连续分配、都满足对齐要求的两块内存,凭什么 malloc 的结果就能看成任意类型的 object,而 int arr[4][5] 就只能看成它声明时候指定的 int[4][5] 类型的 object?

论坛徽章:
0
37 [报告]
发表于 2012-05-11 23:05 |只看该作者
有点搞不懂,哪位大虾帮我解释解释吧,那个pscore是行指针吗?而且,scanf("%f", pscore + 5 * i + j );
这样写的话,得到的是是每个元素的地址吧,怎么会得到每个元素的值呢?还求高人给解答一下哈,在此先谢过了

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
38 [报告]
发表于 2012-05-11 23:12 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
39 [报告]
发表于 2012-05-11 23:13 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
40 [报告]
发表于 2012-05-11 23:21 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP