很奇怪的小程序,求解啊啊啊

kllll1119 2013-06-24 05:27:52
#include <iostream>

using namespace std;

typedef struct _GUID {
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[ 8 ];
} GUID;


void InitGUID(char* strGUID,GUID &guid)
{
sscanf_s(strGUID,"{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",&guid.Data1,&guid.Data2,&guid.Data3,&guid.Data4[0]
,&guid.Data4[1],&guid.Data4[2],&guid.Data4[3]
,&guid.Data4[4],&guid.Data4[5],&guid.Data4[6]
,&guid.Data4[7] );
}


int main()
{
int iSize = sizeof(GUID);
char *pBuf = "{739157EF-3F4E-4323-9A78-38591267DC40}";
GUID guid;
InitGUID(pBuf,guid);
return 0;
}


return 0后为什么栈溢出

结构体改为
typedef struct _GUID {
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[ 9 ];
} GUID;

或者
typedef struct _GUID {
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[ 8 ];
int i;
} GUID;
都可正常运行,百思不得其解,求大神指教一二,感激不尽!
...全文
161 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
nice_cxf 2013-06-24
  • 打赏
  • 举报
回复
unsigned char是一个字节,前边参数是%x,&guid.Data4[7]只有一个字节,因此把后边3个字节的数据写成0了
kllll1119 2013-06-24
  • 打赏
  • 举报
回复
是这里吗%08x,多写了4个字节
kllll1119 2013-06-24
  • 打赏
  • 举报
回复
unsigned long就是4字节,按理说这个程序会以4字节对齐,空间应该足够啊,只少4个字节?
nice_cxf 2013-06-24
  • 打赏
  • 举报
回复
引用 4 楼 kllll1119 的回复:
[quote=引用 1 楼 nice_cxf 的回复:] 越界了,%x对应的数据类型是int,你给的是char,另外sscanf_s参数数目也不对
typedef struct _GUID { unsigned long Data1; unsigned short Data2; unsigned short Data3; unsigned char Data4[ 9 ]; } GUID; 结构体改成这样为什么都可以编译通过呢[/quote] 因为虽然你写的9,但是字节对齐后边加了3个字节的空间,这样你sscanf参数越界把数据写到这些空间自然没问题
kllll1119 2013-06-24
  • 打赏
  • 举报
回复
引用 6 楼 Longee 的回复:
sscanf_s(strGUID,"{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",&guid.Data1,&guid.Data2,&guid.Data3,&guid.Data4[0] ,&guid.Data4[1],&guid.Data4[2],&guid.Data4[3] ,&guid.Data4[4],&guid.Data4[5],&guid.Data4[6] ,&guid.Data4[7] ); 最后的%02x才6个, guid.Data数组是8个
数目是对的,我确认很久了
Longee 2013-06-24
  • 打赏
  • 举报
回复
sscanf_s(strGUID,"{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",&guid.Data1,&guid.Data2,&guid.Data3,&guid.Data4[0] ,&guid.Data4[1],&guid.Data4[2],&guid.Data4[3] ,&guid.Data4[4],&guid.Data4[5],&guid.Data4[6] ,&guid.Data4[7] ); 最后的%02x才6个, guid.Data数组是8个
kllll1119 2013-06-24
  • 打赏
  • 举报
回复
引用 3 楼 rocktyt2 的回复:
改成sscanf就好了 sscanf_s是有额外参数的,具体我没记下来,去查下就知道了 不是和sscanf参数表一样的,某些值后面要附加额外的长度参数
恩,2012推荐使用sscanf_s,sscanf貌似摒弃了!- - 蛋疼
kllll1119 2013-06-24
  • 打赏
  • 举报
回复
引用 1 楼 nice_cxf 的回复:
越界了,%x对应的数据类型是int,你给的是char,另外sscanf_s参数数目也不对
typedef struct _GUID { unsigned long Data1; unsigned short Data2; unsigned short Data3; unsigned char Data4[ 9 ]; } GUID; 结构体改成这样为什么都可以编译通过呢
rocktyt 2013-06-24
  • 打赏
  • 举报
回复
改成sscanf就好了 sscanf_s是有额外参数的,具体我没记下来,去查下就知道了 不是和sscanf参数表一样的,某些值后面要附加额外的长度参数
nice_cxf 2013-06-24
  • 打赏
  • 举报
回复
没注意滚动条,sscanf_s参数数目是对的
nice_cxf 2013-06-24
  • 打赏
  • 举报
回复
越界了,%x对应的数据类型是int,你给的是char,另外sscanf_s参数数目也不对

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧