[英]Why does using the wrong format specifier in C crash my program on Windows 7?
我的計划如下;
#include <stdio.h>
#include <string.h>
int main()
{
char string[] = "Gentlemen start your engines!";
printf("That string is %s characters long.\r\n", strlen(string));
return 0;
}
我正在gcc下編譯,雖然它沒有給我任何錯誤,但程序每次運行時都會崩潰。 從我見過的例子來看,代碼似乎很好。 很高興知道我做錯了什么。
謝謝。
在printf()
使用不正確的格式說明符調用未定義的行為。 正確的格式說明符應該是%zu
(而不是%d
),因為strlen()
的返回類型是size_t
注意: %zu
長度修飾符z
表示長度與size_t
相同的整數
你有錯誤的格式說明符。 %s
用於字符串,但是您傳遞的是size_t
( strlen(string)
)。 在printf()
使用不正確的格式說明符會調用未定義的行為 。 請改用%zu
因為strlen()
的返回類型是size_t
。
所以改變
printf("That string is %s characters long.\r\n", strlen(string));
至:
printf("That string is %zu characters long.\r\n", strlen(string));
由於您正在使用gcc
查看此處以獲取有關可傳遞給printf
更多信息
printf("That string is %d characters long.\r\n", strlen(string));
代替:
printf("That string is %s characters long.\r\n", strlen(string));
你在這里有一個問題printf("That string is %s characters long.\\r\\n", strlen(string));
放
printf("That string is %d characters long.\\r\\n", strlen(string));
%d因為你要打印str的長度(strlen返回數字)
程序崩潰,因為格式化例程嘗試訪問地址0x0000001D
處的字符串,這是strlen()
的結果,其中沒有像字符串那樣,可能根本就沒有可訪問的內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.