sprintf乱搞我的指针和数据?

时间:2011-05-08 16:37:40

标签: c

char purl[1024];
unsigned char * puMember;
unsigned char uMember;
puMember = &uMember;

unsigned char * pMember;
unsigned char Member;
pMember = &Member;

printf("member: %s\n",pMember);
printf("username :%s\n",puMember);
sprintf(purl, "Username: %s %s",puMember,pMember);
printf("URL:%s\n",purl);
printf("member: %s\n",puMember);
printf("username :%s\n",pMember);

输出

member: 12345678
username :User1
URL: username: cUser1 ser1
member: User1
username :ser1

我很困惑为什么sprintf一旦被执行就弄乱了我的指针。

pMember有12345678而puMember有User1,我试图将它们格式化为字符串(purl)但似乎sprintf搞砸了它们:/

任何帮助我如何才能做到这一点?

3 个答案:

答案 0 :(得分:1)

你正在某处覆盖缓冲区。将sprintf替换为snprintf,让C库准确知道目标缓冲区中有多少空间,例如:

char buffer[32];
snprintf( buffer, 32, "my text: %s\n", some_char_ptr );

编辑0:

C中的字符串是零终止的,这意味着在内存块末尾有一个额外的字节,其值为'\0',并且表示字符串的结尾。 C库为strlenstrcpy等字符串函数以及所有%s的{​​{1}}格式说明符假设的内容。否则,这些库函数将在内存中运行,直到找到零值字节或操作系统杀死程序以访问未映射的内存。

答案 1 :(得分:1)

char purl[1024];
unsigned char * puMember;
unsigned char uMember;

uMember有1个字符的空间; 'F''4''\0'

puMember = &uMember;

puMember指向该角色。仅这个角色:对象的大小为1个字节。

unsigned char * pMember;
unsigned char Member;

Member有1个字符的空格

pMember = &Member;

pMember指向1个字符。

printf("member: %s\n",pMember);

不,不,不。 pMember不指向“字符串”。您调用了未定义的行为:任何事情都可能发生

printf("username :%s\n",puMember);

不,不,不。 puMember没有指向“字符串”。您调用了未定义的行为:任何事情都可能发生

sprintf(purl, "Username: %s %s",puMember,pMember);

不,不,不。 puMember和pMember不指向“字符串”。您调用了未定义的行为:任何事情都可能发生

printf("URL:%s\n",purl);
printf("member: %s\n",puMember);
printf("username :%s\n",pMember);

不,不,不......

答案 2 :(得分:1)

你的代码很奇怪 - 如果pMemberpuMember指向单个字符,为什么printf将它们作为一个以mull结尾的字符串?它将打印任何内容,直到它在内存中找到空值。

同样,sprintf将继续在MemberuMember字符之后读取内存并填充purl - 具体取决于它何时在内存中找到空字节。

使用snprintf代替printf可以避免缓冲区溢出,但是您要完全尝试完成什么?