2013年12月12日 星期四

004 變數使用前記得初始化

相關問題


  • 什麼是Call Stack?
  • Callee的區域變數如何處置?
  • 為什麼變數宣告後/使用前,初始化很重要?

沒圖沒真相


範例程式碼

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#define TEST_ITEM (6)

void foo()
{
  char foo[] = {'a','b','c','d','e',0};
  printf("foo string = [%s]\n", foo);
  printf("foo char array = ");
  for(uint8_t i=0;i<int(sizeof(foo)-1);i++)
  {
    printf("[0x%02X] ", foo[i]);
  }
  printf("\n");
}
void zoo()
{
  char zoo[TEST_ITEM] = {0};
  printf("zoo string = [%s]\n", zoo);

  printf("zoo char array = ");
  for(uint8_t i=0;i<sizeof(zoo);i++)
  {
    printf("[0x%02X] ", zoo[i]);
  }
  printf("\n");
}
void bar()
{
  char bar[TEST_ITEM];
  printf("bar string = [%s]\n", bar);

  printf("bar char array = ");
  for(uint8_t i=0;i<sizeof(bar);i++)
  {
    printf("[0x%02X] ", bar[i]);
  }
  printf("\n");
}

int main(int argc, char** argv)
{
  printf("foo() --> zoo() --> bar()\n\n");
  foo();
  zoo();
  bar();
  printf("\nfoo() --> bar() --> zoo() --> bar()\n\n");
  foo();
  bar();
  zoo();
  bar();

  return 0;
}

圖解

foo() --> zoo() --> bar()

foo string = [abcde]
foo char array = [0x61] [0x62] [0x63] [0x64] [0x65]
zoo string = []
zoo char array = [0x00] [0x00] [0x00] [0x00] [0x00] [0x00]
bar string = []
bar char array = [0x00] [0x00] [0x00] [0x00] [0x00] [0x00]

foo() --> bar() --> zoo() --> bar()

foo string = [abcde]
foo char array = [0x61] [0x62] [0x63] [0x64] [0x65]
bar string = [abcde]
bar char array = [0x61] [0x62] [0x63] [0x64] [0x65] [0x00]
zoo string = []
zoo char array = [0x00] [0x00] [0x00] [0x00] [0x00] [0x00]
bar string = []
bar char array = [0x00] [0x00] [0x00] [0x00] [0x00] [0x00]

回家作業


  • 除了手動測試外,有沒有更聰明一點的方式,可以幫你找到程式碼中,未看先猜未初始化就使用的可能錯誤?

參考解答 (updated @ 12/18)

沒有留言:

張貼留言