免费注册 查看新帖 |

Chinaunix

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

[C] 垃圾数据 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2014-09-05 12:33 |只看该作者
回复 10# jason680



上面不是说了吗,有些编译器可能为0,有些不是。
比如你这个例子,在在gcc下就是10,在vc下是 -858993460。
因为你第一次使用的时候已经是0,所有很多时候都忽略是不是编译器开始就初始化为0。
这种问题和那种i+++i++的结果差不多,都属于编译器行为。
假设c的标准强制规定不许初始化为0,但有的让它为0 ,你选择一个你喜欢的编译器不就行了?

论坛徽章:
0
12 [报告]
发表于 2014-09-05 12:36 |只看该作者
回复 9# hellioncu


你证明它干嘛,楼主问题的是你使用的时候,它的值是什么。上面已经说了,有些编译器会把它置为0的。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
13 [报告]
发表于 2014-09-05 12:40 |只看该作者
回复 11# sxcong

I also use gcc but it doesn't get the same value like yours.
   

论坛徽章:
0
14 [报告]
发表于 2014-09-05 12:41 |只看该作者
回复 13# jason680

前面贴过一次了
     gcc -v :
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)


论坛徽章:
0
15 [报告]
发表于 2014-09-05 12:42 |只看该作者
uname -a
Linux AY14011415053559053aZ 3.2.0-29-generic #46-Ubuntu SMP Fri Jul 27 17:03:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

阿里云上的云主机

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
16 [报告]
发表于 2014-09-05 12:52 |只看该作者
本帖最后由 jason680 于 2014-09-05 12:55 编辑

回复 14# sxcong

They are different with
sometime you get the zero with uninitialized variable
always you get the zero with initialized variable

and try bellow:

$ cat count.c
#include <stdio.h>
#include <stdlib.h>

int count( void ){
    int k, i;

    for (i = 0; i < 10; i++){
        k = k + 1;
    }
    return(k);
}
int main(void){
  int c;
  for(c=0; c <=10; c++){
    printf("%d, ", count());
  }
  printf("\n");
  return(0);
}

$ gcc -o count count.c

$ ./count
7996398, 7996408, 7996418, 7996428, 7996438, 7996448, 7996458, 7996468, 7996478, 7996488, 7996498,

$ ./count
2843630, 2843640, 2843650, 2843660, 2843670, 2843680, 2843690, 2843700, 2843710, 2843720, 2843730,

-------------------------------------------------
Note: initialized variable

     int k=0, i;

$ ./count
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,

$ ./count
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
17 [报告]
发表于 2014-09-05 12:55 |只看该作者
sxcong 发表于 2014-09-05 12:36
回复 9# hellioncu


你太固执,试试这个:
  1. #include <stdio.h>

  2. void test()
  3. {
  4.     char buf[100];
  5.     int a;
  6.     char buf2[100];

  7.     printf("ptr= %p\n", &a);
  8.     printf("val= %d\n", a);
  9. }

  10. int main()
  11. {
  12.     test();

  13.     return 0;
  14. }
复制代码

论坛徽章:
0
18 [报告]
发表于 2014-09-05 13:47 |只看该作者
个人觉得这种问题没有什么讨论的必要,既然C标准没有明确指明未初始化变量初始值是否为0,那么我们在编码的时候就应该对变量进行初始化,而不应该交由编译器或者其他东西初始化,这些都是不可控的,编程规则不就是要防止这些不可控因素么?

就是否为编译器进行对变量进行初始化,完全是编译器自己的设计所定,不同的编译器容错,不对,不应该是容错,变量不初始化本身就变准C来说就不是错误。只是不同编译器处理方式不同,这些都是很正常的。

反正我觉得没有什么讨论的必要的,只要我们编程的时候多注意一些就好,防止不可控因素存在于code里面就OK了~

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
19 [报告]
发表于 2014-09-05 14:09 |只看该作者
是0未必是编译器给的,因为所谓验证的例子太过简单,不过是恰巧为0罢了。如果是编译器主动做的,那么汇编中可以明确看到置0的语句。
比如下面的代码,
  1. int function()
  2. {
  3.   int a = 0;
  4.   return a;
  5. }
复制代码
生成的汇编为:
  1.         .file        "zero.c"
  2.         .text
  3.         .globl        function
  4.         .type        function, @function
  5. function:
  6. .LFB0:
  7.         .cfi_startproc
  8.         pushq        %rbp
  9.         .cfi_def_cfa_offset 16
  10.         .cfi_offset 6, -16
  11.         movq        %rsp, %rbp
  12.         .cfi_def_cfa_register 6
  13.         movl        $0, -4(%rbp)            // 这里明确进行的置0的操作
  14.         movl        -4(%rbp), %eax
  15.         popq        %rbp
  16.         .cfi_def_cfa 7, 8
  17.         ret
  18.         .cfi_endproc
  19. .LFE0:
  20.         .size        function, .-function
  21.         .ident        "GCC: (Debian 4.7.2-5) 4.7.2"
  22.         .section        .note.GNU-stack,"",@progbits
复制代码
如果把源代码中赋0的操作去掉,那一句置0的汇编也就没有了。

论坛徽章:
0
20 [报告]
发表于 2014-09-05 15:40 |只看该作者
不是恰巧为0,是和系统有关。
当局部变量没初始化的时候,因为编译器感觉也没有必要给它赋值,所以它的值是内存的。如果这块内在从没用过,linux下大多是0,windows下大多是0xcc。
问题不是在,之前都说了,假设编译器愿意的话,你没初始化的话,自动给你赋了个初值,强迫你初始化,这也没什么啊。
所以这东西说和编译器有关。虽然这些编译器可能不太标准。不能仅仅用了vc,gcc等几个,就全盘否定。况且,就连vc也不是100%兼容所有c/c++条款。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP