免费注册 查看新帖 |

Chinaunix

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

[C++] 找BUG拉..嘿嘿,大家来找找看哈... [复制链接]

论坛徽章:
0
21 [报告]
发表于 2012-11-05 22:09 |只看该作者
回复 17# 群雄逐鹿中原

*x.p相对容易发现...

   

论坛徽章:
0
22 [报告]
发表于 2012-11-05 22:10 |只看该作者
回复 19# koolcoy


    你这不废话嘛...呵呵...纯粹消遣,给大家找茬~~~:)

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
23 [报告]
发表于 2012-11-05 22:29 |只看该作者
回复 22# lsupper

1. 没#include <string>
2. p[1]越界, x.p未初始化
3. #include <iostream> 多余
4. if判断多余
5. sprintf()的参数只能传POD类型的

   

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
24 [报告]
发表于 2012-11-05 23:22 |只看该作者
取结构地址再那样搞,项目里怎么会有这种代码。。。如果有,完全没必要这样写啊。。。
c_str那个,这个编译下就知道了,写的时候粗心罢了。。。

论坛徽章:
0
25 [报告]
发表于 2012-11-06 09:54 |只看该作者
回复 24# cokeboL

结构那个,纯粹为了找BUG,而搞出来的....c_str()这个,window下平台下debug版本一般不会崩溃,release基本会崩溃。linux肯定崩溃...

   

论坛徽章:
0
26 [报告]
发表于 2012-11-06 10:38 |只看该作者
回复 1# lsupper


权且认为你这算个顺序表(额,不考虑栈队列了吧) ...
好...
   struct STEST x = { /*i=?,p[]=???*/}; ... 各种未定义阿...没问题,空表嘛...
    int *p = &x.i;      这里初始化一个p,行,又不影响,这个是指针,怎么也得是指向一个整型的指针吧?NULL也行,而且,居然将p指向了i的值
    p[0] = 4;            //这个不可思议,那么x.i也等于4了吧???别扭,好像让人把脖子拧弯了似的...
    p[1] = 3;            //这个就没戏了吧??


再看下下面的,我只说我能目测到和推出来的了啊,我也有些疑问(有不对的地方还望批评指正,多谢喽):
我知道的string 和char区别只在于一个\ 0的问题,不谈头文件了...std::string也不太熟悉,但转换成char的字符串还是认识的...
string s1="test";                        
    char msgBuffer[256] = {0};   //这个???起码 '0', 这个我也不确定了呵,毕竟0比较特殊,起码我写的时候都回加上单引号的.暂且认为是对吧,
                                               //那么printf("%s", msgBuffer) --> 0\0 了吧? msgBuffer[0]='0'
    if(!s1.empty())                     
        sprintf(msgBuffer, "s1:%s", s1); //s1转换下,上个条件返回true,这里产生字符串:s1:test,可是s1 是string类型的!!!!!!!

貌似这段没什么问题了....我得测试下

    printf("%s,%d,%d\n", msgBuffer, x.i, *x.p); //*x.p 这个不太对吧?这个自始至终都没定义,即使定义了也会出错,x的成员是不可修改的,除非给它初始化一个指针或者引用进行修改


论坛徽章:
1
摩羯座
日期:2013-12-19 10:04:07
27 [报告]
发表于 2012-11-06 11:10 |只看该作者
回复 26# FaintKnowledge

完全混乱 每一句都说错了 你不是在卖萌 就是 学了不足一个星期的新人
如果学了不止一个星期 那我想说的就是 换老师 换课本     

论坛徽章:
0
28 [报告]
发表于 2012-11-06 11:21 |只看该作者
本帖最后由 FaintKnowledge 于 2012-11-06 11:22 编辑

回复 27# lin5161678


萌你个头阿..测试下不就知道了啊
哪儿错了给指指不就得了...

论坛徽章:
0
29 [报告]
发表于 2012-11-06 11:29 |只看该作者
回复 27# lin5161678

哪儿错了,自己看....
  1. [root@speedlinux ~]# gdb a.out
  2. GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2) 7.4-2012.04
  3. Copyright (C) 2012 Free Software Foundation, Inc.
  4. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
  5. This is free software: you are free to change and redistribute it.
  6. There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
  7. and "show warranty" for details.
  8. This GDB was configured as "i686-linux-gnu".
  9. For bug reporting instructions, please see:
  10. <http://bugs.launchpad.net/gdb-linaro/>...
  11. Reading symbols from /root/a.out...done.
  12. (gdb) list
  13. 4
  14. 5       using namespace std;
  15. 6
  16. 7       struct STEST {
  17. 8           int i;
  18. 9           int p[10];
  19. 10      };
  20. 11
  21. 12      int main(void)
  22. 13      {
  23. (gdb) list
  24. 14          struct STEST x;
  25. 15          int *p = &x.i;
  26. 16          p[0] = 4;
  27. 17          p[1] = 3;
  28. 18
  29. 19          string s1="test";
  30. 20          char msgBuffer[256];
  31. 21          if(!s1.empty())
  32. 22             sprintf(msgBuffer, "s1:%s\n",s1.c_str());
  33. 23          x.p[0]=5;
  34. (gdb) list
  35. 24          printf("msgBuffer%s,%d\n", msgBuffer, x.i,x.p[0]);
  36. 25          return 0;
  37. 26      }
  38. (gdb) l
  39. Line number 27 out of range; test.c has 26 lines.
  40. (gdb) break 15 16
  41. Junk at end of arguments.
  42. (gdb) break 15
  43. Breakpoint 1 at 0x8048800: file test.c, line 15.
  44. (gdb) break 16
  45. Breakpoint 2 at 0x8048808: file test.c, line 16.
  46. (gdb) break 17
  47. Breakpoint 3 at 0x8048812: file test.c, line 17.
  48. (gdb) break 18
  49. Breakpoint 4 at 0x804881f: file test.c, line 18.
  50. (gdb) break 19
  51. Note: breakpoint 4 also set at pc 0x804881f.
  52. Breakpoint 5 at 0x804881f: file test.c, line 19.
  53. (gdb) break 20
  54. Breakpoint 6 at 0x8048853: file test.c, line 20.
  55. (gdb) break 22
  56. Breakpoint 7 at 0x8048866: file test.c, line 22.
  57. (gdb) break 23
  58. Breakpoint 8 at 0x804888a: file test.c, line 23.
  59. (gdb) run
  60. Starting program: /root/a.out

  61. Breakpoint 1, main () at test.c:15
  62. 15          int *p = &x.i;
  63. (gdb) print *p
  64. $1 = -1208203904
  65. (gdb) print p[0]
  66. $2 = -1208203904
  67. (gdb) n

  68. Breakpoint 2, main () at test.c:16
  69. 16          p[0] = 4;
  70. (gdb) n

  71. Breakpoint 3, main () at test.c:17
  72. 17          p[1] = 3;
  73. (gdb) n

  74. Breakpoint 4, main () at test.c:19
  75. 19          string s1="test";
  76. (gdb) print p[0]
  77. $3 = 4
  78. (gdb) print p[1]
  79. $4 = 3
  80. (gdb) print x.i
  81. $5 = 4
  82. (gdb) print *x.p
  83. $6 = 3
  84. (gdb) print x.p[0]
  85. $7 = 3
  86. (gdb) print x.p[1]
  87. $8 = -1073745012
  88. (gdb) print x.p[2]
  89. $9 = -1209019464
  90. (gdb) print s1
  91. $10 = {static npos = <optimized out>,
  92.   _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
  93.     _M_p = 0xb7fc7510 "\364", <incomplete sequence \374\267>}}
  94. (gdb) n

  95. Breakpoint 6, main () at test.c:21
  96. 21          if(!s1.empty())
  97. (gdb) n

  98. Breakpoint 7, main () at test.c:22
  99. 22             sprintf(msgBuffer, "s1:%s\n",s1.c_str());
  100. (gdb) print msgBuffer
  101. $11 = "\326\n\370\267\377\377\377\377,.\374\267\370K\374\267\000\000\000\000\334\363\377\277\364\357\377\267\030\371\377\267\001\000\000\000\000\000\000\000\213\302\376\267\320\372\377\267C0辗\001\000\000\000\001\000\000\000\000\000\000\000i,\365\267\244t\374\267\020u\374\267\200E\374\267\364_\354\267\000\000\000\000\001\000\000\000h\364\377\277\253\061辗\344c旆竤曳\000\000\000\000C0辗\001\000\000\000\226\061辗\364_\354\267%2辗\220\206\004\bP\240\004\bD\240\004\b\344c旆怽206\004\b\366\061辗\364\237\004\bS\211\004\b\220\206\004\bP\240\004\bD\240\004\b%2辗03\364\267\270\210\374\267\210\364\377\277o\211\004\b\001\000\000\000\377\377\000\000\001\000\000\000\r\206\004\b\344c旆竆210\374\267\001\000\000\000覊\004\b\001\000\000\000T\365\377\277\\\365\377\277%2辗p\322\376\267\000\000\000\000\211\211\004\b"
  102. (gdb) print msgBuffer[0]@256
  103. $12 = "\326\n\370\267\377\377\377\377,.\374\267\370K\374\267\000\000\000\000\334\363\377\277\364\357\377\267\030\371\377\267\001\000\000\000\000\000\000\000\213\302\376\267\320\372\377\267C0辗\001\000\000\000\001\000\000\000\000\000\000\000i,\365\267\244t\374\267\020u\374\267\200E\374\267\364_\354\267\000\000\000\000\001\000\000\000h\364\377\277\253\061辗\344c旆竤曳\000\000\000\000C0辗\001\000\000\000\226\061辗\364_\354\267%2辗\220\206\004\bP\240\004\bD\240\004\b\344c旆怽206\004\b\366\061辗\364\237\004\bS\211\004\b\220\206\004\bP\240\004\bD\240\004\b%2辗03\364\267\270\210\374\267\210\364\377\277o\211\004\b\001\000\000\000\377\377\000\000\001\000\000\000\r\206\004\b\344c旆竆210\374\267\001\000\000\000覊\004\b\001\000\000\000T\365\377\277\\\365\377\277%2辗p\322\376\267\000\000\000\000\211\211\004\b"
  104. (gdb) print s1.c_str()
  105. $13 = 0x804b014 "test"
  106. (gdb) n

  107. Breakpoint 8, main () at test.c:23
  108. 23          x.p[0]=5;
  109. (gdb) p x.p[0];
  110. Invalid character ';' in expression.
  111. (gdb) p x.p[0]
  112. $14 = 3
  113. (gdb) p x.p[1]
  114. $15 = -1073745012
  115. (gdb) n
  116. 24          printf("msgBuffer%s,%d\n", msgBuffer, x.i,x.p[0]);
  117. (gdb) p x.p[0]@255
  118. $16 = {5, -1073745012, -1209019464, -1208762682, -1208197132, -1208187308, 6, 0, -1210944584, -1209229312, 134524948, -1073745036,
  119.   -1208191520, 1949970803, 175403877, -1208209920, -1208202248, 0, -1073744932, -1207963660, -1207961320, 1, 0, -1208040821,
  120.   -1207960880, -1210765245, 1, 1, 0, -1208669079, -1208191836, -1208191728, -1208203904, -1209245708, 0, 1, -1073744792,
  121.   -1210764885, -1209244700, -1210944584, 0, -1210765245, 1, -1210764906, -1209245708, -1210764763, 134514320, 134520912, 134520900,
  122.   -1209244700, 134514320, -1210764810, 134520820, 134515027, 134514320, 134520912, 134520900, -1210764763, -1208732880, -1208186696,
  123.   -1073744760, 134515055, 1, 65535, 1, 134514189, -1209244700, -1208186696, 1, 134515154, 1, -1073744556, -1073744548, -1210764763,
  124.   -1208036752, 0, 134515081, 269330176, 134515072, -1209245708, 0, -1210870573, 1, -1073744556, -1073744548, -1208100768, 0,
  125.   -1073744612, -1073744548, 0, 134513432, -1209245708, 0, 0, 0, 377269150, 1320947598, 0, 0, 0, 1, 134514480, 0, -1208015200,
  126.   -1210870807, -1207963660, 1, 134514480, 0, 134514513, 134514660, 1, -1073744556, 134515072, 134515184, -1208036752, -1073744564,
  127.   -1207961320, 1, -1073744183, 0, -1073744171, -1073744149, -1073744125, -1073744100, -1073744084, -1073744073, -1073744039,
  128.   -1073743952, -1073743928, -1073743889, -1073743870, -1073743851, -1073743824, -1073743814, -1073743788, -1073742475, -1073742463,
  129.   -1073742434, -1073742341, -1073742321, -1073742296, -1073742281, -1073742257, -1073742226, -1073742216, -1073742198, -1073742170,
  130.   -1073742161, -1073742150, -1073742142, -1073742132, -1073742100, -1073742087, -1073742033, -1073742011, -1073741979, -1073741953,
  131.   -1073741932, -1073741898, -1073741861, 0, 32, -7136, 33, -8192, 16, -1075053569, 6, 4096, 17, 100, 3, 134512692, 4, 32, 5, 9, 7,
  132.   -1208098816, 8, 0, 9, 134514480, 11, 0, 12, 0, 13, 0, 14, 0, 23, 0, 25, -1073744213, 31, -1073741840, 15, -1073744197...}
  133. (gdb) quit
  134. A debugging session is active.

  135.         Inferior 1 [process 3378] will be killed.

  136. Quit anyway? (y or n) y
复制代码

论坛徽章:
1
摩羯座
日期:2013-12-19 10:04:07
30 [报告]
发表于 2012-11-06 11:37 |只看该作者
FaintKnowledge 发表于 2012-11-06 10:38
权且认为你这算个顺序表(额,不考虑栈队列了吧) ...
好...
   struct STEST x = { /*i=?,p[]=???*/}; ... 各种未定义阿...没问题,空表嘛...

没有未定义啊 这里就定义了一个x 你想说未初始化不清楚x的成员的值吧 这个要不要初始化看情况 有时候没必要初始化
    int *p = &x.i;      这里初始化一个p,行,又不影响,这个是指针,怎么也得是指向一个整型的指针吧?NULL也行,而且,居然将p指向了i的值

x.i是一个int &x.i是一个int* ///////////////int* = int* 我完全不知道哪里出问题了
    p[0] = 4;            //这个不可思议,那么x.i也等于4了吧???别扭,好像让人把脖子拧弯了似的...

p[0] == *(p+0) == *p == x.i ///////////////////x.i=4 给一个int变量赋值 有什么不可思议的
    p[1] = 3;            //这个就没戏了吧??

这个数组越界 我就不说什么了

再看下下面的,我只说我能目测到和推出来的了啊,我也有些疑问(有不对的地方还望批评指正,多谢喽):
我知道的string 和char区别只在于一个\ 0的问题,不谈头文件了...std::string也不太熟悉,但转换成char的字符串还是认识的...

string 和 char的区别 这个实在是区别太大了 完全不同的2个东西 你说的那个区别是c风格字符串 和 char[]数组 之间的区别
string s1="test";                        
    char msgBuffer[256] = {0};   //这个???起码 '0', 这个我也不确定了呵,毕竟0比较特殊,起码我写的时候都回加上单引号的.暂且认为是对吧,
                                               //那么printf("%s", msgBuffer) --> 0\0 了吧? msgBuffer[0]='0'

LZ是想把msgBuffer数组的256个元素全部初始化为0
你的做法是把第一个元素初始化为 '0' ==48 剩下的初始化为0
你没有分清楚////////////////////////////
    if(!s1.empty())                     
        sprintf(msgBuffer, "s1:%s", s1); //s1转换下,上个条件返回true,这里产生字符串:s1:test,可是s1 是string类型的!!!!!!!

这里你说对了

貌似这段没什么问题了....我得测试下

    printf("%s,%d,%d\n", msgBuffer, x.i, *x.p); //*x.p 这个不太对吧?这个自始至终都没定义,即使定义了也会出错,x的成员是不可修改的,除非给它初始化一个指针或者引用进行修改

你!!! 汗 x.p 有定义 你说 *x.p x.p指向的对象没定义这个说得过去 x的成员不可以修改这是什么说法 我的天 x的成员不可修改 要x做什么
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP