簡體   English   中英

sscanf復制數據多於可變大小

[英]sscanf copying data more than variable size

我正在下面的代碼中運行,並嘗試使用sscanf復制數據。

#include<stdio.h>
int main()
{
char str[25]="";
char* str2="1234567890123456789012345678901234567";
sscanf(str2,"%s",str);
printf("str =%s,\nstr2=%s,\nsizeof(str)=%d",str,str2,sizeof(str));
return 0;
}

下面是我得到的輸出:

str =1234567890123456789012345678901234567,
str2=1234567890123456789012345678901234567,
sizeof(str)=25

有人可以幫我解釋為什么str存儲的數據量超過其大小。

gcc版本4.8.3

提前致謝。

C語言不檢查數組的大小。 這取決於您。 當您將str2復制到str中時,您正在“入侵”不屬於str的內存空間。 未定義第25個字符后會發生什么。 (幸運的是,它還沒有被修改,因為它是一個簡短的程序,但是不要指望它!)

str只能容納25個字符。 您試圖將25個以上的字符復制到其中。 這會導致不確定的行為。

在C語言中,您有責任確保僅寫入分配的內存。 如果您不遵守規則,則無法保證。

您可以通過在sscanf使用格式字符串"%24s"來修復此代碼。

嘗試使str2更長一些。 我將其擴展了20位,並得到了一個核心轉儲,這是預料之中的。

之所以“成功”,是因為編譯器可能出於效率考慮將值存儲在2 ^ n的基礎上,因此您得到了一些不需要的額外字節。

暫無
暫無

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

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