Chinaunix

标题: 达人们进来 帮忙分析一下 这样搞会有怎样的后果 【呼叫 滑铁卢兄等 来帮个忙吧】 [打印本页]

作者: huxk    时间: 2010-12-28 12:18
标题: 达人们进来 帮忙分析一下 这样搞会有怎样的后果 【呼叫 滑铁卢兄等 来帮个忙吧】
本帖最后由 huxk 于 2010-12-28 14:04 编辑

printf("[%s],[%d],[%d]",str,strlen(str));

是不是最后printf 会按%d 再往后取 一个整形字节

我以前的一个程序代码中 不小心这么搞了 一年后的今天出现问题了。

各位达人 帮忙分析一下吧。
作者: hellioncu    时间: 2010-12-28 13:14
是的。不过是%d,程序应该不至于崩溃
作者: 雨夜流星    时间: 2010-12-28 13:14
  1. #include <stdio.h>
  2. #include <string.h>

  3. typedef struct
  4. {
  5.     char str[10];
  6.     int  a1;
  7.     int  a2;
  8. }st;

  9. int main()
  10. {
  11.     st st1;

  12.     strncpy(st1.str, "abcde", 5);
  13.     st1.a1 = 11111111;
  14.     st1.a2 = 22222222;

  15.     printf("[%s], [%d], [%d]\n", st1.str, st1.a1, st1.a2);
  16.     printf("[%s], [%d], [%d]\n", st1.str, st1.a1);

  17.     printf("[%s], [%x], [%x]\n", st1.str, &(st1.a1), &(st1.a2));
  18.     printf("[%s], [%x], [%x]\n", st1.str, &(st1.a1));
  19. }
复制代码
///////////////////
结果
[root@liukun8 tmp]# ./a.out
[abcde], [11111111], [22222222]
[abcde], [11111111], [-2068506752]
[abcde], [2ea6d1ac], [2ea6d1b0]
[abcde], [2ea6d1ac], [84b51780]

[root@liukun8 tmp]# ./a.out
[abcde], [11111111], [22222222]
[abcde], [11111111], [-2068506752]
[abcde], [714298bc], [714298c0]
[abcde], [714298bc], [84b51780]

[root@liukun8 tmp]# ./a.out
[abcde], [11111111], [22222222]
[abcde], [11111111], [-2068506752]
[abcde], [3fcd53bc], [3fcd53c0]
[abcde], [3fcd53bc], [84b51780]
作者: huxk    时间: 2010-12-28 13:44

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <errno.h>

  4. int main()
  5. {
  6.         char str[] = "aaaaaaaaaaaaaa";

  7.         int ret = 0;

  8.         ret = printf("%s %d %d\n",str,strlen(str));

  9.         printf("ret = [%d],err = [%s]\n",ret,strerror(errno));

  10.         return 0;
  11. }
复制代码
我测了下 不明真相到底如何 想请哪位达人分析一下这个可能的后果
作者: 雨夜流星    时间: 2010-12-28 14:31
printf("[%s],[%d],[%d]",str,strlen(str));

是不是最后printf 会按%d 再往后取 一个整形字节

我以前 ...
huxk 发表于 2010-12-28 12:18



    不一定吧,我测的(3楼), 结果并不是接下来的一个%d
作者: huxk    时间: 2010-12-28 16:18
你那个结构体难道有对齐操作?
作者: wb112200    时间: 2010-12-28 16:40
以上两位都是用的什么编译环境?
作者: huxk    时间: 2010-12-28 16:44
回复 7# wb112200


   
我用的 gcc version 3.3.3 (SuSE Linux)
作者: wb112200    时间: 2010-12-28 16:50
我在JAVA下测试 编译没问题 运行时报错...
作者: wb112200    时间: 2010-12-28 16:59
回复 8# huxk


    哦 我的gcc-4.4 编译没问题运行也core 这种情况估得考虑编译器对“错误”的默认处理了
作者: OwnWaterloo    时间: 2010-12-28 18:15
出什么问题了?
和ls一样core了?
还是strlen的结果的输出和预期不符合?
是64位么?
作者: net_robber    时间: 2010-12-28 18:21
是的。不过是%d,程序应该不至于崩溃
hellioncu 发表于 2010-12-28 13:14



    这个不好说,也许读到不能读的,一样会core
作者: OwnWaterloo    时间: 2010-12-28 18:24
奇葩了……
gcc3就是最后一个输出不对, gcc4在编译时(还没有运行)就core了……
作者: huxk    时间: 2010-12-28 19:00
回复 13# OwnWaterloo


    这个程序跑了一年多了 今天才出这个问题 程序也没core掉 进程还在的 是一个从消息队列接收消息读端 发送端发送了 但是 这个程序今天有一会就突然不接收消息了

日志就定位在类似 我给出的那个 printf上 再不往下走了 我怀疑是这个问题 请帮忙分析下
作者: OwnWaterloo    时间: 2010-12-28 19:04
回复 14# huxk

我也不知道……

你先改成:
printf("%s %lu", s, (unsigned long)strlen(s) );
看看?
(如果支持c99的话, 好像有一个用于size_t的, %z?)
如果是64位, 而且是strlen的结果不符, 应该就是这个问题。


如果这没问题了, 再改成:
printf("%s %lu %d", s, (unsigned long)strlen(s) );

要出了问题, 我也没辙……
作者: huxk    时间: 2010-12-28 19:09
本帖最后由 huxk 于 2010-12-28 19:12 编辑

回复 15# OwnWaterloo


    是 32 位的 我想知道 这个 printf 应该是按 全面指导的格式串 在一个缓冲区中按相应数据类型 的长度 逐个操作的 是么

那 最后那个 %d 到底往哪里去读数据了?
作者: OwnWaterloo    时间: 2010-12-28 19:12
回复 16# huxk

不懂……
作者: chenzhanyiczy    时间: 2010-12-28 19:30
回复  OwnWaterloo


    是 32 位的 我想知道 这个 printf 应该是按 全面指导的格式串 在一个缓冲区中 ...
huxk 发表于 2010-12-28 19:09



    不好说。
可能是上级栈帧里的某个变量




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2