[英]sprintf messing around with my pointers and data?
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似乎把它們弄亂了:/
任何幫助我怎么能做到這一點?
您正在某個地方覆蓋緩沖區。 用snprintf
替換sprintf
,以使C庫確切知道目標緩沖區中有多少空間,例如:
char buffer[32];
snprintf( buffer, 32, "my text: %s\n", some_char_ptr );
C中的字符串以零結尾,這意味着內存塊的末尾有一個額外的字節,其值為'\\0'
,並表示該字符串的末尾。 C庫針對諸如strlen
和strcpy
類的字符串函數以及針對所有printf
的%s
格式說明符假定的內容。 否則,這些庫函數將在內存中運行,直到找到零值字節或OS殺死您的程序以訪問未映射的內存。
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);
不不不 ...
你的代碼是很奇怪-如果pMember
和puMember
點單字符,為什么printf
他們作為一個軟簾結尾的字符串? 它將打印任何內容,直到在內存中找到空值為止。
同樣, sprintf
將保持閱讀后記憶Member
和uMember
字符,並填補了purl
-這取決於當它在內存中找到一個空字節上。
使用snprintf
而不是printf
可以避免緩沖區溢出,但是您到底要做什么呢?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.