C语言的博大精深

Kent以东首帅哥

新手上路
注册
2002-01-27
消息
10,446
荣誉分数
0
声望点数
0
弄了十来年了,每次看看都会发现些新东西,象下面这样的小程序,里面竟然还会隐含一个设计错误。

void main()
{
int i;
int iArray[20];

(for i=0;i<20;i++){
iArray = 1;
}

}
 
C语言的这种似是而非的特点创造了很多就业机会.
 
半个so发,
等着听大师讲解怎么个博大精深,怎么个设计设计错误。
 
其中之一是:
i应该是unsigned int,因为C语言的数组下标永远是从0开始,不可能有负数,用int来做下标说明思想不清。
假如因为某种原因i被改变成负数,必然破坏堆栈里其它数据,还不容易发现.而如果用unsigned int,即使
i被改变,多半变成一个很大的正数,投射到被系统保护的其它内存区,一下就出现access violation,很容易发现改正。
 
用Ada, Ada是强类型,一编译就发现问题了,
可惜没人用。
 
最初由 Kent以东首帅哥 发布
其中之一是:
i应该是unsigned int,因为C语言的数组下标永远是从0开始,不可能有负数,用int来做下标说明思想不清。
假如因为某种原因i被改变成负数,必然破坏堆栈里其它数据,还不容易发现.而如果用unsigned int,即使
i被改变,多半变成一个很大的正数,投射到被系统保护的其它内存区,一下就出现access violation,很容易发现改正。
这个问题好像有点似是而非。常用的32位系统下的c的int 都是32bits,也就是说
int b = negative or positive value
uint a = n + (uint)b; //could be an overflow
uint c = n + b; //could be an overflow, too
a == c
相似地,64位和16位系统下c的int 是64/16bits,可以推导出同样的结果。当然,如果32bits system的int 定义为16bit或者64 bits system 的int 定义为32bits,就会有帅哥提出的问题了。这种情况并不常见。
 
最初由 mooncake 发布

这个问题好像有点似是而非。常用的32位系统下的c的int 都是32bits,也就是说
int b = negative or positive value
uint a = n + (uint)b; //could be an overflow
uint c = n + b; //could be an overflow, too
a == c
相似地,64位和16位系统下c的int 是64/16bits,可以推导出同样的结果。当然,如果32bits system的int 定义为16bit或者64 bits system 的int 定义为32bits,就会有帅哥提出的问题了。这种情况并不常见。
一个特例是8088,16位计算机系统20位地址总线,不过敌人很狡猾,采取了段/偏移寻址,也不会出现类似帅哥指出的问题。
 
有没有其二啊?
其一说的对!不过经典例子都是这么写的!我相信教科书都是这么写的!
挺好!
 
最初由 Kent以东首帅哥 发布
弄了十来年了,每次看看都会发现些新东西,象下面这样的小程序,里面竟然还会隐含一个设计错误。

void main()
{
int i;
int iArray[20];

(for i=0;i<20;i++){
iArray = 1;
}

}


1, 设计缺陷;
2, 语法错误;
3, 离开了ANSI/ISO标准;
4, Non-defensive coding;

正确的应该是这样:

int main(void )
{
int iArray[20];

for(int i=0;i<sizeof(iArray);i++){
iArray = 1;
}
return 0;
}
 
最初由 Kent以东首帅哥 发布
sizeof(iArray)返回的是整个数组的大小,除非是8位机才行。
sizeof(iArray) / sizeof(int) will work.
 
Do you guys enjoy spending time on these tiny problems?
 
最初由 gdntfrank 发布
Do you guys enjoy spending time on these tiny problems?
yes, we do. What do you think we should do by visiting CFC?
 
最初由 mooncake 发布

sizeof(iArray) / sizeof(int) will work.

Better be:

sizeof(iArray) / sizeof(iArray[0])

:D
 
后退
顶部