利用 printf 來把值寫入某個變數

在 C 語言中,透過 printf 來印東西一點都不稀奇。但你知道 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 其實比想像的還要危險呢。

留言

這個網誌中的熱門文章

如何將Linux打造成OpenFlow Switch:Openvswitch

如何利用 Wireshark 來監聽 IEEE 802.11 的管理封包

我弟家的新居感恩禮拜分享:善頌善禱