簡體   English   中英

sprintf弄亂了我的指針和數據?

[英]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 );

編輯0:

C中的字符串以零結尾,這意味着內存塊的末尾有一個額外的字節,其值為'\\0' ,並表示該字符串的末尾。 C庫針對諸如strlenstrcpy類的字符串函數以及針對所有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);

不不不 ...

你的代碼是很奇怪-如果pMemberpuMember點單字符,為什么printf他們作為一個軟簾結尾的字符串? 它將打印任何內容,直到在內存中找到空值為止。

同樣, sprintf將保持閱讀后記憶MemberuMember字符,並填補了purl -這取決於當它在內存中找到一個空字節上。

使用snprintf而不是printf可以避免緩沖區溢出,但是您到底要做什么呢?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM