size_t 的使用是安全的吗?

2019-05-21 19:59:39 +08:00
 codechaser

最近碰到个很奇怪的问题,在写 for 循环的时候 vscode 会自动把i的类型设为size_t,我看这也没改,一直用着也没事,但是昨天在写这样几句(大致差不多就这样写的)出了问题:

const boarder = 20;
for (size_t i = boarder; i < width;i++){
	/**code**/
}

发现一直有错误,一直不结束循环,百思不得其解,打印 i 发现 i 的初值是个很长的负数,改成int i = boarder就没问题了.今天想到这个又回头看了一下,不能确定是不是因为size_t.

3318 次点击
所在节点    C
15 条回复
jmc891205
2019-05-21 20:03:35 +08:00
为啥不声明 boarder 的类型?编译器不报错?
codechaser
2019-05-21 20:18:01 +08:00
@jmc891205 ...我打错了,漏了一个`int`
maggch
2019-05-21 20:18:33 +08:00
size_t 无符号
exonuclease
2019-05-21 20:24:54 +08:00
size_t 是无符号的
lrh3321
2019-05-21 21:00:10 +08:00
size_t 无符号,--的 for 循环会永远>=0
secondwtq
2019-05-21 21:08:14 +08:00
<amp-youtube data-videoid="wvtFGa6XJDU" layout="responsive" width="480" height="270"></amp-youtube>
forestyuan
2019-05-21 22:19:53 +08:00
无符号数和有符号数比较大小,编译器会报警告。如果没报,可能是你的开发环境没有设置好。
zwh2698
2019-05-21 22:28:32 +08:00
Width 类型?
liuzhedash
2019-05-22 10:40:30 +08:00
有点意思,但是没能复现
CRVV
2019-05-22 10:50:43 +08:00
1. size_t 当然能用,用对了就是安全的,用错了可能不安全
2. 发代码要用复制粘贴功能,不要手动输入
3. 发代码要把代码粘全,你发的代码编译不过
ryd994
2019-05-22 11:20:48 +08:00
一个单线程的用户程序,讲什么线程安全?
codechaser
2019-05-22 11:49:02 +08:00
@CRVV 嗯嗯,不好意思。我以为只需要贴问题代码就可以了,下次改。
codechaser
2019-05-22 11:50:02 +08:00
@zwh2698 width 是 opencv 图片的 width 属性
zwh2698
2019-05-22 13:32:17 +08:00
Width 的类型是 int 吧,你这一句有两次转型,i 初始化的时候类型要做提升,<的时候 width 要做提升,width 是负数的时候,循环就是会很多次。你可能会说图形宽怎么有负值。正负代表的是方向。绝对值就是宽。比如位图如果是倒存的,高就是负值。你可以找个位图文件看看。
dosmlp
2019-05-30 23:19:02 +08:00
size_t 虽然有不同实现,但极大概率是无符号的,i++换成++i 可以避免某些情况下的 bug
另外信息量少也没办法复现这个问题,但肯定是你代码问题,是不是文件编码有问题?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/566327

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX