#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 这里的逗号是中文的而非英文输入方式输入的?
LZ有没注意到("%d,%d 这里的逗号是中文的而非英文输入方式输入的?
#3
给力
#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);
上面两个逗号不一样啊
printf("%d,%d \n",s->a,s->b);
上面两个逗号不一样啊
#7
printf是输出而不是输入。即使是中文逗号也可正常输出。
建议LZ在debug下的反汇编窗口查看、单步执行汇编语句,看sci_temp->last_time此时的值。
建议LZ在debug下的反汇编窗口查看、单步执行汇编语句,看sci_temp->last_time此时的值。
#8
哥,输出的时候""里可以是任意的字符,不信你去试试!
不是这个问题!
谢谢!
#9
+1
#10
是输出啊,不是输入!
#11
单步跟踪,输出堆栈信息看看,主要是内存&sci_temp附近的8个字节
#12
你看清楚了再回帖吧,别人云亦云、!
谢谢!
#13
要么开debug,要么把第二段的代码贴全。
#14
是必现的,还是偶尔出现的?
你的程序是不是多线程的,在其他地方sci_temp->last_time被修改了吧?
BS上面几个问题都没看清楚的SB!
你的程序是不是多线程的,在其他地方sci_temp->last_time被修改了吧?
BS上面几个问题都没看清楚的SB!
#15
time_for_connect是什么类型?
比如
int64 a;
int32 b;
printf("%d, %d", a, b);
这样,一些比较老的编译器可能产生程序崩溃,也可能产生怪异的结果。
因为输出时候要读的是32位数据,可能把a截断成两部分,分别给"%d, %d"两个占位符。
但是这种情况不应该出在VS9这种比较新的编译器中。
还有,你问题描述的不够清楚,把代码贴全。
比如
int64 a;
int32 b;
printf("%d, %d", a, b);
这样,一些比较老的编译器可能产生程序崩溃,也可能产生怪异的结果。
因为输出时候要读的是32位数据,可能把a截断成两部分,分别给"%d, %d"两个占位符。
但是这种情况不应该出在VS9这种比较新的编译器中。
还有,你问题描述的不够清楚,把代码贴全。
#16
你首先想到的应该是你自己的问题。
为什么那么多人用都没错。
你用的时候出错了呢。
莫非别人都错了。
就你对?
为什么那么多人用都没错。
你用的时候出错了呢。
莫非别人都错了。
就你对?
#17
sci_temp->time_for_connect
是什么类型?
是什么类型?
#18
补全代码如下:
提示:看清楚3个printf是连在一起的,中间不可能修改成员的值!
提示:看清楚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
withwzm@163.com
#20
哥,你没看清楚就别瞎叫啊!
3个printf连着打印的,就算是修改了打印出来的值也是一样的啊!
服了、
谢谢!
#21
觉得你首先应该回应15F,17F的问题,我也觉得那是最大的值得怀疑的问题。printf要求你的参数必须和格式字符串完全匹配,如果time_to_connection的长度不是int相同的长度,会有问题
#22
老实说,我个人赞同16F的观点,一开始就怀疑编译器的bug,而不想想是不是自己哪有问题,是不对的。除非你能排除自己的问题(我对此深表怀疑),你才能确信说这是编译器的bug,编译器是有bug,但是比普通程序员出错的可能性要小很多。
我相信这应该是第一个参数的类型不是int导致的,%d要求打印int,而printf不会最隐式类型转换。
我相信这应该是第一个参数的类型不是int导致的,%d要求打印int,而printf不会最隐式类型转换。
#23
LZ,补全代码用到的各结构体定义发出来看一下呢?
#24
类型是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
不是我不回复,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位的....
所以...
#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
LZ在debug时显示的值是多少?码不全。。菜菜编译不过
#28
sizeof(time_t)在你平台上等于sizeof(int)么?
#29
linux下:
5
2,5
5
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
试验了一下,此为正解,VS2008中time_t为64位,而VC6.0中为32位。
#32
不是bug
#33
到此为止,问题算是解决了! 15楼正解!!!
谢谢各位的解释,也谢谢大家的建议,虽然有的人语气不是很好,还是谢谢!
也希望这个帖子能给别人帮助!
谢谢各位的解释,也谢谢大家的建议,虽然有的人语气不是很好,还是谢谢!
也希望这个帖子能给别人帮助!
#34
还在说是编译器的问题。。。。。。。。。。。
出问题了,首先应该想是不是自己的问题……
time_t在vs2008下time_t被定义为int64或者为long long
你用%d输出,只输出了高32位,均为0
#35
虚心接受批评!
#1
环境:vs2008专业版+VAx插件
#2
printf("%d,%d\n",sci_temp->time_for_connect,sci_temp->last_time);
LZ有没注意到("%d,%d 这里的逗号是中文的而非英文输入方式输入的?
LZ有没注意到("%d,%d 这里的逗号是中文的而非英文输入方式输入的?
#3
给力
#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);
上面两个逗号不一样啊
printf("%d,%d \n",s->a,s->b);
上面两个逗号不一样啊
#7
printf是输出而不是输入。即使是中文逗号也可正常输出。
建议LZ在debug下的反汇编窗口查看、单步执行汇编语句,看sci_temp->last_time此时的值。
建议LZ在debug下的反汇编窗口查看、单步执行汇编语句,看sci_temp->last_time此时的值。
#8
哥,输出的时候""里可以是任意的字符,不信你去试试!
不是这个问题!
谢谢!
#9
+1
#10
是输出啊,不是输入!
#11
单步跟踪,输出堆栈信息看看,主要是内存&sci_temp附近的8个字节
#12
你看清楚了再回帖吧,别人云亦云、!
谢谢!
#13
要么开debug,要么把第二段的代码贴全。
#14
是必现的,还是偶尔出现的?
你的程序是不是多线程的,在其他地方sci_temp->last_time被修改了吧?
BS上面几个问题都没看清楚的SB!
你的程序是不是多线程的,在其他地方sci_temp->last_time被修改了吧?
BS上面几个问题都没看清楚的SB!
#15
time_for_connect是什么类型?
比如
int64 a;
int32 b;
printf("%d, %d", a, b);
这样,一些比较老的编译器可能产生程序崩溃,也可能产生怪异的结果。
因为输出时候要读的是32位数据,可能把a截断成两部分,分别给"%d, %d"两个占位符。
但是这种情况不应该出在VS9这种比较新的编译器中。
还有,你问题描述的不够清楚,把代码贴全。
比如
int64 a;
int32 b;
printf("%d, %d", a, b);
这样,一些比较老的编译器可能产生程序崩溃,也可能产生怪异的结果。
因为输出时候要读的是32位数据,可能把a截断成两部分,分别给"%d, %d"两个占位符。
但是这种情况不应该出在VS9这种比较新的编译器中。
还有,你问题描述的不够清楚,把代码贴全。
#16
你首先想到的应该是你自己的问题。
为什么那么多人用都没错。
你用的时候出错了呢。
莫非别人都错了。
就你对?
为什么那么多人用都没错。
你用的时候出错了呢。
莫非别人都错了。
就你对?
#17
sci_temp->time_for_connect
是什么类型?
是什么类型?
#18
补全代码如下:
提示:看清楚3个printf是连在一起的,中间不可能修改成员的值!
提示:看清楚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
withwzm@163.com
#20
哥,你没看清楚就别瞎叫啊!
3个printf连着打印的,就算是修改了打印出来的值也是一样的啊!
服了、
谢谢!
#21
觉得你首先应该回应15F,17F的问题,我也觉得那是最大的值得怀疑的问题。printf要求你的参数必须和格式字符串完全匹配,如果time_to_connection的长度不是int相同的长度,会有问题
#22
老实说,我个人赞同16F的观点,一开始就怀疑编译器的bug,而不想想是不是自己哪有问题,是不对的。除非你能排除自己的问题(我对此深表怀疑),你才能确信说这是编译器的bug,编译器是有bug,但是比普通程序员出错的可能性要小很多。
我相信这应该是第一个参数的类型不是int导致的,%d要求打印int,而printf不会最隐式类型转换。
我相信这应该是第一个参数的类型不是int导致的,%d要求打印int,而printf不会最隐式类型转换。
#23
LZ,补全代码用到的各结构体定义发出来看一下呢?
#24
类型是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
不是我不回复,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位的....
所以...
#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
LZ在debug时显示的值是多少?码不全。。菜菜编译不过
#28
sizeof(time_t)在你平台上等于sizeof(int)么?
#29
linux下:
5
2,5
5
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
试验了一下,此为正解,VS2008中time_t为64位,而VC6.0中为32位。
#32
不是bug
#33
到此为止,问题算是解决了! 15楼正解!!!
谢谢各位的解释,也谢谢大家的建议,虽然有的人语气不是很好,还是谢谢!
也希望这个帖子能给别人帮助!
谢谢各位的解释,也谢谢大家的建议,虽然有的人语气不是很好,还是谢谢!
也希望这个帖子能给别人帮助!
#34
还在说是编译器的问题。。。。。。。。。。。
出问题了,首先应该想是不是自己的问题……
time_t在vs2008下time_t被定义为int64或者为long long
你用%d输出,只输出了高32位,均为0
#35
虚心接受批评!