免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
81 [报告]
发表于 2012-05-12 15:20 |只看该作者
本帖最后由 OwnWaterloo 于 2012-05-12 15:22 编辑

回复 74# pmerofc

假设SIZEOF(T)是一个T对象需要的空间最少空间,ALIGNOF(T)是对齐需求。
sizeof(T) == ceil( SIZEOF(T), ALIGNOF(T) ) >= SIZEOF(T) 。
C/C++的sizeof(T) 其实是 STRIDEOF(T) —— 相邻的两个T对象之间的最小距离。

所以对齐的账早就算在每个对象的尾填充里了。对象数组只要首元素满足对齐需要,并且所有元素紧密排列就够了。
所以对齐的账早就算在每个对象的尾填充里了。对象数组只要首元素满足对齐需要,并且所有元素紧密排列就够了。
对T a[N]; 大小依然是sizeof(a) == sizeof(T)*N; alignof(a) == alignof(T)。

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

论坛徽章:
0
83 [报告]
发表于 2012-05-12 15:45 |只看该作者
for( i = 0 ; i < 4 ; i++ )
{
     for( j = 0 ; j < 5 ; j ++ )
     {
          scanf("%f", pscore[j]);
     }
}

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

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

论坛徽章:
0
86 [报告]
发表于 2012-05-12 15:51 |只看该作者
本帖最后由 三月廿七 于 2012-05-12 15:57 编辑

void print2D(float pscore[][5])
{
      for( i = 0 ; i < 4 ; i++ )
      {
           for( j = 0 ; j < 5 ; j ++ )
           {
                 scanf("%f", pscore[j][]);
           }
      }
}

在任何地方, 我都不会用指针去访问数组,我只用数组索引,即使是动态分配的内存也一样

下面2句不是针对你说的
别人喜欢一维数组、喜欢指针我不干涉,
别人也别干涉我,不要自讨没趣

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

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

单看T a[M][N];确实有这种可能性:
T* p = &a[0][0];
通过 p (类型为T*)的计算只能保证正确 &a[0][0] 到 &a[0][N] 之间的元素,对超过&a[0][N]的部分(并不一定恰好在&a[0][N],也许在之后的某个点)可能会发生回绕。于是结果就乱七八糟。
而T* q = &a[1][0]; 通过q,才能保证正确访问 &a[1][0] 到 &a[1][N]之间的元素。


但结合malloc(还有union等东西),如果编译器敢这么设计T* p的指针格式,那么:
T* p = (T*)malloc(M * N * sizeof(T) ); // 或者按你在56楼的写法, p = (T*)malloc(sizeof(T[N*M])) 或calloc
p 也无法访问被分配出来的所有空间。



我不知道怎么准确的描述……总之,可能存在单个object大小(也许是一个数组object)远小于地址空间的情况。
也存在字长不能寻址整个地址空间,于是编译器只能用两个机器字来拼出一个指针。
在这种情况下,对指针运算,编译器为了效率,只改这两个机器字中的一个而忽略另一个也是合乎C规范的。这种实现的可能性也是存在的。

但这单个object,可以被解释为任意类型(包括某种结构体,包括解释为一维/多维数组对象)。
编译器为了效率,在节省了一个机器字改动的情况下,应该会尽量宽松,尽量让另一个能寻址这单个object的任意位置。
而不会更严格不会为了检查出更多不合乎C规范的错误,做出更多限制。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
89 [报告]
发表于 2012-05-12 16:23 |只看该作者
三月廿七 发表于 2012-05-12 15:51
void print2D(float pscore[][5])
{
      for( i = 0 ; i < 4 ; i++ )
      {
           for( j = 0 ; j < 5 ; j ++ )
           {
                 scanf("%f", pscore[j][]);
           }
      }
}

在任何地方, 我都不会用指针去访问数组,我只用数组索引,即使是动态分配的内存也一样

下面2句不是针对你说的
别人喜欢一维数组、喜欢指针我不干涉,
别人也别干涉我,不要自讨没趣


我不知道你是不是针对我?
但论坛不是你开的,是不是干涉,是不是自讨没趣不是由你说了算。

你自己上一段代码,还假惺惺的写个标题大家评评,被喷了究竟是谁自讨没趣?
既然你又上代码了,我又可以发问了: 你这print2D函数就只处理 float a[?][5]吗? float a[?][13]呢?

我可没干涉你。
我只是在这楼里指出这函数不通用,在那楼里指出混用char*/string混用A/T版本函数很喜感。
而你要不要这么写根本不关我的事。而且我还希望你继续这么写,否则以后没乐子了

论坛徽章:
0
90 [报告]
发表于 2012-05-12 17:36 |只看该作者
OwnWaterloo 发表于 2012-05-12 16:23
我不知道你是不是针对我?
但论坛不是你开的,是不是干涉,是不是自讨没趣不是由你说了算。

// 你这print2D函数就只处理 float a[?][5]吗? float a[?][13]呢?
这个我真想请教一下, float a[?][13] 你怎么办

其实,我想针对狗气球,
以及我先前用2维数组解析 Excel的时候,某个指手画脚的2B,

还有,我也感觉你挺乐的,
还有,你怎么乐也不能让我的产品异常中断
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP