免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
131 [报告]
发表于 2012-05-13 14:29 |只看该作者
回复 108# 幻の上帝


为什么我那么喜欢指针啊?
这个东西就是一个大杀器,可惜java等程序员无法享受,而c/c++等程序员又懂不珍惜,一天到晚听指针不好就嗤之以鼻,真是笨蛋。

论坛徽章:
0
132 [报告]
发表于 2012-05-13 14:31 |只看该作者
回复 108# 幻の上帝


    还有,这种接口设计成

f(*p, size1)
f(**p, size1, size2)
当然,size可能需要根据实际另外取个名字。

有什么问题么?我觉得就比你什么数组好,而且这在C非常多的开源代码中就很常见,远远比传个数组更常见。

论坛徽章:
0
133 [报告]
发表于 2012-05-13 14:36 |只看该作者
回复 117# OwnWaterloo


你是在把问题无限复杂

论坛徽章:
0
134 [报告]
发表于 2012-05-13 14:37 |只看该作者
回复 122# AD8018


    我一般了这种回复就是笑一下,你何必说出

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

论坛徽章:
0
136 [报告]
发表于 2012-05-13 14:41 |只看该作者
回复 122# AD8018


    我错了,是成立的

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

论坛徽章:
0
138 [报告]
发表于 2012-05-13 14:46 |只看该作者
回复 137# pmerofc


那你觉得呢?

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

为什么躲不掉?
无论是多少维,都用相应的header描述,而实际的underlying data始终是一维的。
这样不行么?

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

关于restrict。举个也许没什么实际意义的例子:

  1. void fill(int* xs, int const* len, int x)
  2. {
  3.       int i;
  4.       for (i=0; i<*len; ++i)
  5.             xs[i] = x;
  6. }
复制代码
i<*len,每次循环都会重新获取*len,因为xs[ i ] = x也许会修改*len。


如果加上restrict:

  1. void fill(int* restrict xs, int const* restrict len, int x) { 其他代码不变 }
复制代码
编译器就可以假设xs[ i ] = x 不会修改len。 i<*len中的*len就只会读取一次。


但实际上,xs与len是否确实是同一个对象?编译器是没法检查的。

  1. typedef struct {
  2.       int len;
  3.       int* xs;
  4. } vector;

  5. vector v;
  6. v.len = 12;
  7. v.xs = (int*)malloc(12*sizeof(int));
  8. fill(v.xs,&v.len,12);
复制代码
就是不同对象。


而如果只用一个一维数组表示vector,用0元素当作len,其他元素当作xs,就违反了:

  1. int* vector = (int*)malloc((1+12)*sizeof(int));
  2. vector[0] = 12;
  3. fill(vector+1,vector,12);
复制代码
但不会出错。



这是否有用实现解释语言的嫌疑?
就算是有吧……  与memory.h, p[-1]/p[N+1] 等不同, 它们违反了, 而且能够设想出出错的例子, 即使这种设想暂时没找到。
而其他几种,我前面说的,一脚踩在C的钢丝上,另一脚悬空的情况, 它们也违反了, 但想不出出错的可能性(在不违反C的精神的情况下)……


而关于memory buffer彻底没看明白……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP