这个算vs2008 bug不???

时间:2021-04-24 15:03:28
先看下面的代码:

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct str{
int a;
int b;
}str;
int main(int argc,char * argv[])
{
str * s=(str *)malloc(sizeof(str));
s->a=2,s->b = 5;
printf("%d\n",s->b);
printf("%d,%d \n",s->a,s->b);
printf("%d\n",s->b);
free(s);
return 0;
}

运行上述代码,结果是:

5
2,5
5

 这应该是绝对正确的!

但是我vs2008下的一个工程,代码结构和上面一模一样,运行结果却非常诡异:
工程代码片段如下:

printf("%d\n",sci_temp->last_time);/*成员time_for_connect已经赋值2,last_time赋值5*/
printf("%d,%d\n",sci_temp->time_for_connect,sci_temp->last_time);
printf("%d \n",sci_temp->last_time);

运行结果却是:

5
2,0
5


也就是说,将last_time成员单独打印的时候输出5,而放time_for_connect成员后面一起打印的时候却成了0!
 情况千真万确,如果不信,可以给你看看我的工程!绝对的匪夷所思!请高手解释为什么!这是不是vs的bug啊?

35 个解决方案

#1


环境:vs2008专业版+VAx插件

#2


printf("%d,%d\n",sci_temp->time_for_connect,sci_temp->last_time);   
LZ有没注意到("%d,%d 这里的逗号是中文的而非英文输入方式输入的?

#3


引用 2 楼 yyg990441 的回复:
printf("%d,%d\n",sci_temp->time_for_connect,sci_temp->last_time);   
LZ有没注意到("%d,%d 这里的逗号是中文的而非英文输入方式输入的?

给力

#4


"%d,%d\n// 第二个数没有读进去

#5


没错,除非你输入“2,0”它才能读入。

#6


printf("%d,%d\n",sci_temp->time_for_connect,sci_temp->last_time);  

    printf("%d,%d \n",s->a,s->b);

上面两个逗号不一样啊


  


#7


printf是输出而不是输入。即使是中文逗号也可正常输出。

建议LZ在debug下的反汇编窗口查看、单步执行汇编语句,看sci_temp->last_time此时的值。

#8


引用 2 楼 yyg990441 的回复:
printf("%d,%d\n",sci_temp->time_for_connect,sci_temp->last_time);   
LZ有没注意到("%d,%d 这里的逗号是中文的而非英文输入方式输入的?

哥,输出的时候""里可以是任意的字符,不信你去试试!
 不是这个问题!
谢谢!

#9


引用 7 楼 logiciel 的回复:
printf是输出而不是输入。即使是中文逗号也可正常输出。

建议LZ在debug下的反汇编窗口查看、单步执行汇编语句,看sci_temp->last_time此时的值。

+1

#10


引用 5 楼 bokutake 的回复:
没错,除非你输入“2,0”它才能读入。

是输出啊,不是输入!
  

#11


单步跟踪,输出堆栈信息看看,主要是内存&sci_temp附近的8个字节

#12


引用 4 楼 delphiwcdj 的回复:
"%d,%d\n// 第二个数没有读进去

你看清楚了再回帖吧,别人云亦云、!
谢谢!

#13


要么开debug,要么把第二段的代码贴全。

#14


是必现的,还是偶尔出现的?

你的程序是不是多线程的,在其他地方sci_temp->last_time被修改了吧?

BS上面几个问题都没看清楚的SB!

#15


time_for_connect是什么类型?
比如
int64 a;
int32 b;
printf("%d, %d", a, b);
这样,一些比较老的编译器可能产生程序崩溃,也可能产生怪异的结果。
因为输出时候要读的是32位数据,可能把a截断成两部分,分别给"%d, %d"两个占位符。
但是这种情况不应该出在VS9这种比较新的编译器中。
还有,你问题描述的不够清楚,把代码贴全。

#16


你首先想到的应该是你自己的问题。
为什么那么多人用都没错。
你用的时候出错了呢。
莫非别人都错了。
就你对?

#17


sci_temp->time_for_connect
是什么类型?

#18


补全代码如下:
提示:看清楚3个printf是连在一起的,中间不可能修改成员的值!

void print_sip_connect_info(void)
{
struct tm *ts;
sip_connect_info * sci_temp = sip_connect_head;
int iTemp = 0;
if(!sci_temp)
printf("No sip connection escablished!!!\n");
while(sci_temp != NULL)
{
printf("第%d次sip对话:\n",++iTemp);
printf("From uri=%s \nto uri=%s\n",sci_temp->from_uri,sci_temp->to_uri);
ts = localtime(&sci_temp->invite_start_time);
printf("Invite time:%d-%d-%d-%d-%d-%d\n",ts->tm_year+1900,ts->tm_mon+1,ts->tm_mday,ts->tm_hour,ts->tm_min,ts->tm_sec);
ts = localtime(&sci_temp->connect_escablish_time);
printf("Escablish time:%d-%d-%d-%d-%d-%d\n",ts->tm_year+1900,ts->tm_mon+1,ts->tm_mday,ts->tm_hour,ts->tm_min,ts->tm_sec);
ts = localtime(&sci_temp->disconnect_time);
printf("Disconnect time:%d-%d-%d-%d-%d-%d\n",ts->tm_year+1900,ts->tm_mon+1,ts->tm_mday,ts->tm_hour,ts->tm_min,ts->tm_sec);
                printf("连接持续时间%d\n",sci_temp->last_time);/*输出5*/
printf("建立连接所花时间:%d s \t连接持续时间%d s\n\n",sci_temp->time_for_connect,sci_temp->last_time);/*输出2, 0*/
                printf("连接持续时间%d\n",sci_temp->last_time);/*又输出5*/
sci_temp = sci_temp->next;
}
}



#19


要工程代码的可以发邮件探讨!
withwzm@163.com

#20


引用 16 楼 zhengjiankang 的回复:
你首先想到的应该是你自己的问题。
为什么那么多人用都没错。
你用的时候出错了呢。
莫非别人都错了。
就你对?

哥,你没看清楚就别瞎叫啊!
3个printf连着打印的,就算是修改了打印出来的值也是一样的啊!
服了、
谢谢!

#21


觉得你首先应该回应15F,17F的问题,我也觉得那是最大的值得怀疑的问题。printf要求你的参数必须和格式字符串完全匹配,如果time_to_connection的长度不是int相同的长度,会有问题
引用 20 楼 zm19870528 的回复:
引用 16 楼 zhengjiankang 的回复:

你首先想到的应该是你自己的问题。
为什么那么多人用都没错。
你用的时候出错了呢。
莫非别人都错了。
就你对?

哥,你没看清楚就别瞎叫啊!
3个printf连着打印的,就算是修改了打印出来的值也是一样的啊!
服了、
谢谢!

#22


老实说,我个人赞同16F的观点,一开始就怀疑编译器的bug,而不想想是不是自己哪有问题,是不对的。除非你能排除自己的问题(我对此深表怀疑),你才能确信说这是编译器的bug,编译器是有bug,但是比普通程序员出错的可能性要小很多。
我相信这应该是第一个参数的类型不是int导致的,%d要求打印int,而printf不会最隐式类型转换。

引用 20 楼 zm19870528 的回复:
引用 16 楼 zhengjiankang 的回复:

你首先想到的应该是你自己的问题。
为什么那么多人用都没错。
你用的时候出错了呢。
莫非别人都错了。
就你对?

哥,你没看清楚就别瞎叫啊!
3个printf连着打印的,就算是修改了打印出来的值也是一样的啊!
服了、
谢谢!

#23


LZ,补全代码用到的各结构体定义发出来看一下呢?

#24


引用 23 楼 onthebluesky 的回复:
LZ,补全代码用到的各结构体定义发出来看一下呢?

类型是time_t类型的!
结构体代码如下:


typedef struct _sip_connect_info {
time_t invite_start_time;/*存储第一个invite请求的时间*/
time_t connect_escablish_time;/*存储和INVITE对应的第一个ACK请求时间,即会话建立的时间*/
time_t time_for_connect;/*connect_escablish_time - invite_start_time*/
time_t disconnect_time;/*存储对BYE的OK回应的时间*/
time_t last_time;/*disconnect_time - connect_escablish_time*/
char from_uri[128];/*发起的uri*/
char to_uri[128];/*接受的uri*/
char callid[128];
char from_tag[128];
char to_tag[128];
struct _sip_connect_info * next;
}sip_connect_info;

#25


引用 21 楼 arong1234 的回复:
觉得你首先应该回应15F,17F的问题,我也觉得那是最大的值得怀疑的问题。printf要求你的参数必须和格式字符串完全匹配,如果time_to_connection的长度不是int相同的长度,会有问题
引用 20 楼 zm19870528 的回复:
引用 16 楼 zhengjiankang 的回复:

你首先想到的应该是你自己的问题。
为什么那么多人用都没错。
你用的时候出错了呢。……

不是我不回复,csdn一下子只准许回复3次,你懂得!
还有,我在发帖子之前自己想了好久,而且这个程序在vc6.0下运行结果是对的!
 另外,我非常确定这是编译器的问题,因为打印的时候是联系打印的(麻烦你再看一下)!抛开一切来说,就算我算法什么都错了,连续打印的结果也不会错啊!
  不过,还是谢谢你的提醒!

#26


LZ,我这边的time_t

#ifndef _TIME_T_DEFINED
#ifdef _USE_32BIT_TIME_T
typedef __time32_t time_t;      /* time value */
#else
typedef __time64_t time_t;      /* time value */
#endif
#define _TIME_T_DEFINED         /* avoid multiple def's of time_t */
#endif

VS2005下,新建默认工程下,是

typedef __time64_t time_t;      /* time value */

即time_t是64位的....

所以...

#27


引用 25 楼 zm19870528 的回复:
引用 21 楼 arong1234 的回复:

觉得你首先应该回应15F,17F的问题,我也觉得那是最大的值得怀疑的问题。printf要求你的参数必须和格式字符串完全匹配,如果time_to_connection的长度不是int相同的长度,会有问题
引用 20 楼 zm19870528 的回复:
引用 16 楼 zhengjiankang 的回复:

你首先想到的应该是你自己的问题。……

LZ在debug时显示的值是多少?码不全。。菜菜编译不过

#28


sizeof(time_t)在你平台上等于sizeof(int)么?

#29


linux下:
5
2,5 
5

#30


继续发,我猜测楼主的那边同样 time_t是64位的...
所以才会发生这种情况


#include <stdio.h>
#include <windows.h>

int main()
{
time_t a1=1,a2=2;

printf("%I64d  , %I64d \n",a1,a2);

printf("%d , %d ,%d ,%d\n",a1,a2);//因为print根据字符串来解析堆栈中的参数,导致当time_t 64位的情况下,%d每次输出32位,所以,使用4个%d就会发现,全部的值被打印出来了



printf("%d\n",a2);

    return 0;
}

#31


引用 30 楼 bysdy 的回复:
继续发,我猜测楼主的那边同样 time_t是64位的...
所以才会发生这种情况


C/C++ code

#include <stdio.h>
#include <windows.h>

int main()
{
    time_t a1=1,a2=2;

    printf("%I64d  , %I64d \n",a1,a2);

    printf("%……

试验了一下,此为正解,VS2008中time_t为64位,而VC6.0中为32位。 

#32


不是bug

#33


  到此为止,问题算是解决了! 15楼正解!!!
    谢谢各位的解释,也谢谢大家的建议,虽然有的人语气不是很好,还是谢谢!
 也希望这个帖子能给别人帮助!

#34


引用 25 楼 zm19870528 的回复:
引用 21 楼 arong1234 的回复:

觉得你首先应该回应15F,17F的问题,我也觉得那是最大的值得怀疑的问题。printf要求你的参数必须和格式字符串完全匹配,如果time_to_connection的长度不是int相同的长度,会有问题
引用 20 楼 zm19870528 的回复:
引用 16 楼 zhengjiankang 的回复:

你首先想到的应该是你自己的问题。
……


还在说是编译器的问题。。。。。。。。。。。
出问题了,首先应该想是不是自己的问题……

time_t在vs2008下time_t被定义为int64或者为long long
你用%d输出,只输出了高32位,均为0

#35


引用 34 楼 skyworth98 的回复:
引用 25 楼 zm19870528 的回复:
引用 21 楼 arong1234 的回复:

觉得你首先应该回应15F,17F的问题,我也觉得那是最大的值得怀疑的问题。printf要求你的参数必须和格式字符串完全匹配,如果time_to_connection的长度不是int相同的长度,会有问题
引用 20 楼 zm19870528 的回复:
引用 16 楼 zhengjiankang……
 
虚心接受批评!
 

#1


环境:vs2008专业版+VAx插件

#2


printf("%d,%d\n",sci_temp->time_for_connect,sci_temp->last_time);   
LZ有没注意到("%d,%d 这里的逗号是中文的而非英文输入方式输入的?

#3


引用 2 楼 yyg990441 的回复:
printf("%d,%d\n",sci_temp->time_for_connect,sci_temp->last_time);   
LZ有没注意到("%d,%d 这里的逗号是中文的而非英文输入方式输入的?

给力

#4


"%d,%d\n// 第二个数没有读进去

#5


没错,除非你输入“2,0”它才能读入。

#6


printf("%d,%d\n",sci_temp->time_for_connect,sci_temp->last_time);  

    printf("%d,%d \n",s->a,s->b);

上面两个逗号不一样啊


  


#7


printf是输出而不是输入。即使是中文逗号也可正常输出。

建议LZ在debug下的反汇编窗口查看、单步执行汇编语句,看sci_temp->last_time此时的值。

#8


引用 2 楼 yyg990441 的回复:
printf("%d,%d\n",sci_temp->time_for_connect,sci_temp->last_time);   
LZ有没注意到("%d,%d 这里的逗号是中文的而非英文输入方式输入的?

哥,输出的时候""里可以是任意的字符,不信你去试试!
 不是这个问题!
谢谢!

#9


引用 7 楼 logiciel 的回复:
printf是输出而不是输入。即使是中文逗号也可正常输出。

建议LZ在debug下的反汇编窗口查看、单步执行汇编语句,看sci_temp->last_time此时的值。

+1

#10


引用 5 楼 bokutake 的回复:
没错,除非你输入“2,0”它才能读入。

是输出啊,不是输入!
  

#11


单步跟踪,输出堆栈信息看看,主要是内存&sci_temp附近的8个字节

#12


引用 4 楼 delphiwcdj 的回复:
"%d,%d\n// 第二个数没有读进去

你看清楚了再回帖吧,别人云亦云、!
谢谢!

#13


要么开debug,要么把第二段的代码贴全。

#14


是必现的,还是偶尔出现的?

你的程序是不是多线程的,在其他地方sci_temp->last_time被修改了吧?

BS上面几个问题都没看清楚的SB!

#15


time_for_connect是什么类型?
比如
int64 a;
int32 b;
printf("%d, %d", a, b);
这样,一些比较老的编译器可能产生程序崩溃,也可能产生怪异的结果。
因为输出时候要读的是32位数据,可能把a截断成两部分,分别给"%d, %d"两个占位符。
但是这种情况不应该出在VS9这种比较新的编译器中。
还有,你问题描述的不够清楚,把代码贴全。

#16


你首先想到的应该是你自己的问题。
为什么那么多人用都没错。
你用的时候出错了呢。
莫非别人都错了。
就你对?

#17


sci_temp->time_for_connect
是什么类型?

#18


补全代码如下:
提示:看清楚3个printf是连在一起的,中间不可能修改成员的值!

void print_sip_connect_info(void)
{
struct tm *ts;
sip_connect_info * sci_temp = sip_connect_head;
int iTemp = 0;
if(!sci_temp)
printf("No sip connection escablished!!!\n");
while(sci_temp != NULL)
{
printf("第%d次sip对话:\n",++iTemp);
printf("From uri=%s \nto uri=%s\n",sci_temp->from_uri,sci_temp->to_uri);
ts = localtime(&sci_temp->invite_start_time);
printf("Invite time:%d-%d-%d-%d-%d-%d\n",ts->tm_year+1900,ts->tm_mon+1,ts->tm_mday,ts->tm_hour,ts->tm_min,ts->tm_sec);
ts = localtime(&sci_temp->connect_escablish_time);
printf("Escablish time:%d-%d-%d-%d-%d-%d\n",ts->tm_year+1900,ts->tm_mon+1,ts->tm_mday,ts->tm_hour,ts->tm_min,ts->tm_sec);
ts = localtime(&sci_temp->disconnect_time);
printf("Disconnect time:%d-%d-%d-%d-%d-%d\n",ts->tm_year+1900,ts->tm_mon+1,ts->tm_mday,ts->tm_hour,ts->tm_min,ts->tm_sec);
                printf("连接持续时间%d\n",sci_temp->last_time);/*输出5*/
printf("建立连接所花时间:%d s \t连接持续时间%d s\n\n",sci_temp->time_for_connect,sci_temp->last_time);/*输出2, 0*/
                printf("连接持续时间%d\n",sci_temp->last_time);/*又输出5*/
sci_temp = sci_temp->next;
}
}



#19


要工程代码的可以发邮件探讨!
withwzm@163.com

#20


引用 16 楼 zhengjiankang 的回复:
你首先想到的应该是你自己的问题。
为什么那么多人用都没错。
你用的时候出错了呢。
莫非别人都错了。
就你对?

哥,你没看清楚就别瞎叫啊!
3个printf连着打印的,就算是修改了打印出来的值也是一样的啊!
服了、
谢谢!

#21


觉得你首先应该回应15F,17F的问题,我也觉得那是最大的值得怀疑的问题。printf要求你的参数必须和格式字符串完全匹配,如果time_to_connection的长度不是int相同的长度,会有问题
引用 20 楼 zm19870528 的回复:
引用 16 楼 zhengjiankang 的回复:

你首先想到的应该是你自己的问题。
为什么那么多人用都没错。
你用的时候出错了呢。
莫非别人都错了。
就你对?

哥,你没看清楚就别瞎叫啊!
3个printf连着打印的,就算是修改了打印出来的值也是一样的啊!
服了、
谢谢!

#22


老实说,我个人赞同16F的观点,一开始就怀疑编译器的bug,而不想想是不是自己哪有问题,是不对的。除非你能排除自己的问题(我对此深表怀疑),你才能确信说这是编译器的bug,编译器是有bug,但是比普通程序员出错的可能性要小很多。
我相信这应该是第一个参数的类型不是int导致的,%d要求打印int,而printf不会最隐式类型转换。

引用 20 楼 zm19870528 的回复:
引用 16 楼 zhengjiankang 的回复:

你首先想到的应该是你自己的问题。
为什么那么多人用都没错。
你用的时候出错了呢。
莫非别人都错了。
就你对?

哥,你没看清楚就别瞎叫啊!
3个printf连着打印的,就算是修改了打印出来的值也是一样的啊!
服了、
谢谢!

#23


LZ,补全代码用到的各结构体定义发出来看一下呢?

#24


引用 23 楼 onthebluesky 的回复:
LZ,补全代码用到的各结构体定义发出来看一下呢?

类型是time_t类型的!
结构体代码如下:


typedef struct _sip_connect_info {
time_t invite_start_time;/*存储第一个invite请求的时间*/
time_t connect_escablish_time;/*存储和INVITE对应的第一个ACK请求时间,即会话建立的时间*/
time_t time_for_connect;/*connect_escablish_time - invite_start_time*/
time_t disconnect_time;/*存储对BYE的OK回应的时间*/
time_t last_time;/*disconnect_time - connect_escablish_time*/
char from_uri[128];/*发起的uri*/
char to_uri[128];/*接受的uri*/
char callid[128];
char from_tag[128];
char to_tag[128];
struct _sip_connect_info * next;
}sip_connect_info;

#25


引用 21 楼 arong1234 的回复:
觉得你首先应该回应15F,17F的问题,我也觉得那是最大的值得怀疑的问题。printf要求你的参数必须和格式字符串完全匹配,如果time_to_connection的长度不是int相同的长度,会有问题
引用 20 楼 zm19870528 的回复:
引用 16 楼 zhengjiankang 的回复:

你首先想到的应该是你自己的问题。
为什么那么多人用都没错。
你用的时候出错了呢。……

不是我不回复,csdn一下子只准许回复3次,你懂得!
还有,我在发帖子之前自己想了好久,而且这个程序在vc6.0下运行结果是对的!
 另外,我非常确定这是编译器的问题,因为打印的时候是联系打印的(麻烦你再看一下)!抛开一切来说,就算我算法什么都错了,连续打印的结果也不会错啊!
  不过,还是谢谢你的提醒!

#26


LZ,我这边的time_t

#ifndef _TIME_T_DEFINED
#ifdef _USE_32BIT_TIME_T
typedef __time32_t time_t;      /* time value */
#else
typedef __time64_t time_t;      /* time value */
#endif
#define _TIME_T_DEFINED         /* avoid multiple def's of time_t */
#endif

VS2005下,新建默认工程下,是

typedef __time64_t time_t;      /* time value */

即time_t是64位的....

所以...

#27


引用 25 楼 zm19870528 的回复:
引用 21 楼 arong1234 的回复:

觉得你首先应该回应15F,17F的问题,我也觉得那是最大的值得怀疑的问题。printf要求你的参数必须和格式字符串完全匹配,如果time_to_connection的长度不是int相同的长度,会有问题
引用 20 楼 zm19870528 的回复:
引用 16 楼 zhengjiankang 的回复:

你首先想到的应该是你自己的问题。……

LZ在debug时显示的值是多少?码不全。。菜菜编译不过

#28


sizeof(time_t)在你平台上等于sizeof(int)么?

#29


linux下:
5
2,5 
5

#30


继续发,我猜测楼主的那边同样 time_t是64位的...
所以才会发生这种情况


#include <stdio.h>
#include <windows.h>

int main()
{
time_t a1=1,a2=2;

printf("%I64d  , %I64d \n",a1,a2);

printf("%d , %d ,%d ,%d\n",a1,a2);//因为print根据字符串来解析堆栈中的参数,导致当time_t 64位的情况下,%d每次输出32位,所以,使用4个%d就会发现,全部的值被打印出来了



printf("%d\n",a2);

    return 0;
}

#31


引用 30 楼 bysdy 的回复:
继续发,我猜测楼主的那边同样 time_t是64位的...
所以才会发生这种情况


C/C++ code

#include <stdio.h>
#include <windows.h>

int main()
{
    time_t a1=1,a2=2;

    printf("%I64d  , %I64d \n",a1,a2);

    printf("%……

试验了一下,此为正解,VS2008中time_t为64位,而VC6.0中为32位。 

#32


不是bug

#33


  到此为止,问题算是解决了! 15楼正解!!!
    谢谢各位的解释,也谢谢大家的建议,虽然有的人语气不是很好,还是谢谢!
 也希望这个帖子能给别人帮助!

#34


引用 25 楼 zm19870528 的回复:
引用 21 楼 arong1234 的回复:

觉得你首先应该回应15F,17F的问题,我也觉得那是最大的值得怀疑的问题。printf要求你的参数必须和格式字符串完全匹配,如果time_to_connection的长度不是int相同的长度,会有问题
引用 20 楼 zm19870528 的回复:
引用 16 楼 zhengjiankang 的回复:

你首先想到的应该是你自己的问题。
……


还在说是编译器的问题。。。。。。。。。。。
出问题了,首先应该想是不是自己的问题……

time_t在vs2008下time_t被定义为int64或者为long long
你用%d输出,只输出了高32位,均为0

#35


引用 34 楼 skyworth98 的回复:
引用 25 楼 zm19870528 的回复:
引用 21 楼 arong1234 的回复:

觉得你首先应该回应15F,17F的问题,我也觉得那是最大的值得怀疑的问题。printf要求你的参数必须和格式字符串完全匹配,如果time_to_connection的长度不是int相同的长度,会有问题
引用 20 楼 zm19870528 的回复:
引用 16 楼 zhengjiankang……
 
虚心接受批评!