V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
codechaser
V2EX  ›  C

size_t 的使用是安全的吗?

  •  
  •   codechaser · 2019-05-21 19:59:39 +08:00 · 3318 次点击
    这是一个创建于 2009 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    15 条回复    2019-05-30 23:19:02 +08:00
    jmc891205
        1
    jmc891205  
       2019-05-21 20:03:35 +08:00 via iPhone
    为啥不声明 boarder 的类型?编译器不报错?
    codechaser
        2
    codechaser  
    OP
       2019-05-21 20:18:01 +08:00
    @jmc891205 ...我打错了,漏了一个`int`
    maggch
        3
    maggch  
       2019-05-21 20:18:33 +08:00 via Android
    size_t 无符号
    exonuclease
        4
    exonuclease  
       2019-05-21 20:24:54 +08:00 via iPhone
    size_t 是无符号的
    lrh3321
        5
    lrh3321  
       2019-05-21 21:00:10 +08:00 via Android
    size_t 无符号,--的 for 循环会永远>=0
    secondwtq
        6
    secondwtq  
       2019-05-21 21:08:14 +08:00   ❤️ 1
    forestyuan
        7
    forestyuan  
       2019-05-21 22:19:53 +08:00
    无符号数和有符号数比较大小,编译器会报警告。如果没报,可能是你的开发环境没有设置好。
    zwh2698
        8
    zwh2698  
       2019-05-21 22:28:32 +08:00 via Android
    Width 类型?
    liuzhedash
        9
    liuzhedash  
       2019-05-22 10:40:30 +08:00
    有点意思,但是没能复现
    CRVV
        10
    CRVV  
       2019-05-22 10:50:43 +08:00
    1. size_t 当然能用,用对了就是安全的,用错了可能不安全
    2. 发代码要用复制粘贴功能,不要手动输入
    3. 发代码要把代码粘全,你发的代码编译不过
    ryd994
        11
    ryd994  
       2019-05-22 11:20:48 +08:00 via Android
    一个单线程的用户程序,讲什么线程安全?
    codechaser
        12
    codechaser  
    OP
       2019-05-22 11:49:02 +08:00 via Android
    @CRVV 嗯嗯,不好意思。我以为只需要贴问题代码就可以了,下次改。
    codechaser
        13
    codechaser  
    OP
       2019-05-22 11:50:02 +08:00 via Android
    @zwh2698 width 是 opencv 图片的 width 属性
    zwh2698
        14
    zwh2698  
       2019-05-22 13:32:17 +08:00 via Android
    Width 的类型是 int 吧,你这一句有两次转型,i 初始化的时候类型要做提升,<的时候 width 要做提升,width 是负数的时候,循环就是会很多次。你可能会说图形宽怎么有负值。正负代表的是方向。绝对值就是宽。比如位图如果是倒存的,高就是负值。你可以找个位图文件看看。
    dosmlp
        15
    dosmlp  
       2019-05-30 23:19:02 +08:00
    size_t 虽然有不同实现,但极大概率是无符号的,i++换成++i 可以避免某些情况下的 bug
    另外信息量少也没办法复现这个问题,但肯定是你代码问题,是不是文件编码有问题?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1062 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:41 · PVG 03:41 · LAX 11:41 · JFK 14:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.