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搞砸了它们:/
任何帮助我如何才能做到这一点?
答案 0 :(得分:1)
你正在某处覆盖缓冲区。将sprintf
替换为snprintf
,让C库准确知道目标缓冲区中有多少空间,例如:
char buffer[32];
snprintf( buffer, 32, "my text: %s\n", some_char_ptr );
C中的字符串是零终止的,这意味着在内存块末尾有一个额外的字节,其值为'\0'
,并且表示字符串的结尾。 C库为strlen
和strcpy
等字符串函数以及所有%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)
你的代码很奇怪 - 如果pMember
和puMember
指向单个字符,为什么printf
将它们作为一个以mull结尾的字符串?它将打印任何内容,直到它在内存中找到空值。
同样,sprintf
将继续在Member
和uMember
字符之后读取内存并填充purl
- 具体取决于它何时在内存中找到空字节。
使用snprintf
代替printf
可以避免缓冲区溢出,但是您要完全尝试完成什么?