利用 printf 來把值寫入某個變數
在 C 語言中,透過 printf 來印東西一點都不稀奇。但你知道 printf 也可以拿來寫值嗎??
看看下面的範例,看看會印出來什麼東西。
印出來的結果如下:
blah blah
val = 5
為什麼呢?如果我們去查 manual 的話,可以看到下面的定義:
n
The number of characters written so far is stored into the integer indicated by the int * (or variant) pointer argument. No argument is converted.
也就是使用 %n 的時候,他會把到目前為止已經印出多少個字元的數目給寫入一個 int 的變數。常見的做法在於對齊,如下面的程式
但只有這樣嗎?其實,%n 也可以拿去寫值到程式內特定的記憶體位置喔,只要你好好的處理 pointer 的部分的話。所以 printf 其實比想像的還要危險呢。
看看下面的範例,看看會印出來什麼東西。
#include "stdio.h" int main() { int val; printf("bala %n bala\n", &val); printf("val = %d\n", val); return 0; }
印出來的結果如下:
blah blah
val = 5
為什麼呢?如果我們去查 manual 的話,可以看到下面的定義:
n
The number of characters written so far is stored into the integer indicated by the int * (or variant) pointer argument. No argument is converted.
也就是使用 %n 的時候,他會把到目前為止已經印出多少個字元的數目給寫入一個 int 的變數。常見的做法在於對齊,如下面的程式
int n; printf("%s: %nFoo\n", "hello", &n); printf("%*sBar\n", n, " ");
但只有這樣嗎?其實,%n 也可以拿去寫值到程式內特定的記憶體位置喔,只要你好好的處理 pointer 的部分的話。所以 printf 其實比想像的還要危險呢。
留言
張貼留言