2014年2月22日

陣列名稱與指標


定義一個 ptr pointer, point to 1024 個 char size 的記憶體區塊,
 
char *ptr = malloc( sizeof(char) * 1024);
sizeof(ptr) 所得到的是該指標本身的大小,而 sizeof (*ptr) 所得到的是,指標指向的記憶體區塊之第一個 item 之型態大小。
char array[1024];
sizeof(array) 為 1024 個 char 的大小,

sizeof(*array) 為一個 char 的大小,因為 *array 會被 compiler 視為 *(array+0),等同於 array[0],代表 array 中的第一個 item 的 size,
ex. array[2] = *(array+2) = *(2+array) = 2[array]

如果要將 array 每個 item 內容設定為 0, 可以 memset(array, 0, sizeof(array));
而若要將 pointer 所指向的整塊 memory 都設定為 0,就要自己記錄 memory size:
buf_size*=sizeof(char);

char *ptr = malloc( buf_size);

memset(ptr, 0, buf_size);
sizeof 取到 (*pointer) 是 1 個 element 的 size

#include<stdio.h>
struct co {
  int a; int b;  int c;  int d;  int e;
  int f;  int g;  int h;  int i;  int j;
};

int main(void)
{
  struct co *a=NULL;
  int *b;
  printf("sizeof(struct co): %d\n", sizeof(struct co));
  printf("sizeof(a): %d\n", sizeof(a));
  a = malloc(sizeof(struct co)*2);
  b = malloc(sizeof(int)*2);
  printf("sizeof(*a): %d\n", sizeof(*a));
  printf("sizeof(*b): %d\n", sizeof(*b));
  return 0;
}

ming@mp:/tmp$ gcc test.c -o test
ming@mp:/tmp$ ./test
sizeof(struct co): 40
sizeof(a): 4 ( pointer a 的 size)
sizeof(*a): 40 ( 1 個 struct co 的 size )
sizeof(*b): 4 ( 1 個 int 的 size)

2 則留言:

  1. 請問因為"a = malloc(sizeof(struct co)*2);",有乘以2,為何"printf("sizeof(*a): %d\n", sizeof(*a));"的結果不是80?
    謝謝你的文章~

    回覆刪除
    回覆
    1. 你好,a 本身只是指向一個 struct co 的指標(pointer),sizeof(*a) 取得的記憶體大小就是一個 struct co 的大小。

      雖然我們知道 malloc 配置了兩個邏輯上連續的 struct co,但是 a 指標的型別代表的只是指向一個 struct co 的指標,

      所以透過 malloc 配置的記憶體,若要讓後續的程式碼知道這塊記憶體空間的大小,通常會需要另外一個變數來儲存這塊記憶體的長度。

      e.g.

      struct sock_addr {
      uint32_t *ip;
      uint16_t len;
      };

      struct sock_addr src;

      src.ip = malloc (sizeof(uint8_t) *4));

      if( src.ip == NULL ) {
      perror("Fail to malloc");
      }

      src.len = (uint16_t) sizeof(uint8_t)*4;

      這也是使用 pointer 要注意的地方,與 array 的變數名稱不同。

      刪除

歡迎留言