2010年12月25日 星期六

多一個位元組

在Window下執行, 結果 file 的長度是 7?

#include <stdio.h>
int main(void)
{
  FILE *fp;
  fp = fopen("file", "w");
  fputs("hello\n", fp);
  fclose(fp);
  return 0;
}

恆等式

等式左右各加一, 就不是等式了?

#include <stdio.h>
int main()
{
  int a[10];
  if (a == &a)
    printf("yes\n");
  else
    printf("no\n");

  if (a + 1 == &a + 1)
    printf("yes\n");
  else
    printf("no\n");
}

輸出是這樣.

yes
no

2010年12月24日 星期五

What you see is not what you get

#include <stdio.h>

int main()
{
  long int my_fax_number = 0233662167;
  printf("my fax number is %ld\n", my_fax_number);
  return 0;
}

The output.

my fax number is 40854647

差之毫釐, 失之千里.

The output is "no".

#include <stdio.h>

int main()
{
  float a = 1.134;
  float b = 3.402;
  if (a * 3 == b)
    printf("yes");
  else
    printf("no");
}

2010年12月22日 星期三

無形相的指標

很多函式 (例如 fread) 中緩衝區的型態是 *void。
簡單的來說,就是不指向任何有形相的資料。
每當我看到這個 *void,就會想到金剛經的這句話。

所有一切眾生之類,若卵生、若胎生、若濕生、若化生;若有色、若無色;
若有想、若無想;若非有想,若非無想,我皆令入無餘涅槃,而滅度之。

今天無論是整數,浮點數,或是字元,我都令入無餘記憶體,而滅度之。
記憶體裡的位元組,無非是一些高低電壓而已。
所謂資料型態,只是在你的眼中存在而已,事實上哪裡存在呢?
雖然如此,我還是必須用一個指標來表示這些我眼中的資料。
既然無論什麼形相事實上都不存在,那就用一個沒有形相的指標,這樣不就對了嗎?

2010年12月21日 星期二

255 and 256

The output is count = 255
We did write 256 characters, Why do we only get 255 of them?

#include <stdio.h>

int main(void)
{
  FILE *fp;
  char c;
  int count;
  int i;
  fp = fopen("file", "wb");
  for (i = 0; i < 256; i++)
    fputc(i, fp);
  fclose(fp);
  fp = fopen("file", "rb");
  count = 0;
  while ((c = fgetc(fp)) != EOF)
    count++;
  printf("count = %d\n", count);
  return 0;
}

2010年12月20日 星期一

電腦在偷懶?

兩次的輸出不一樣??? 是不是電腦在偷懶?


this
is
a
string
this


#include <stdio.h>
#include <string.h>
int main(void)
{
  char string[] = "this is a string";
  char *start;

  start = string;
  start = strtok(start, " ");
  while (start != NULL) {
    printf("%s\n", start);
    start = strtok(NULL, " ");
  }
  start = string;
  start = strtok(start, " ");
  while (start != NULL) {
    printf("%s\n", start);
    start = strtok(NULL, " ");
  }
  return 0;
}

註解在哪裡?

這個程式的輸出是 6, 因為有的註解會偽裝.

#include <stdio.h>

int division(int *a, int *b)
{
  return *a/*b /* a simple division */;
}
int main()
{
  int a = 6;
  int b = 2;
  int *aptr = &a;
  int *bptr = &b;
  printf("%d\n", division(aptr, bptr));
}

感謝某位靈的助教提供.

2010年12月19日 星期日

唯讀記憶體的悲哀

有一個字串長這樣 char *string = "this is a string";
想使用 strtok 將它切成一段一段, 結果程式就當掉了.
這就是唯讀記憶體的悲哀...

counter 加一

void foo(int *counter)
{
  *counter = 0;
  ...
  *counter++; 
}

counter 是傳進來的計數器指標, 於是就有強者這樣寫, 然後就死掉了.