近來在寫程序的時候遇到了一個問題,就是傳遞一個數組指針進入一個函數的時候,雖然指針能夠順利的傳遞,但是,我們無法求出該數組的大小。見下面的代碼:
#include <stdio.h>
void setNum(int *p,int a);
void setNum(int *p);

int main()


{

int a[] =
{1,2,4,5};
printf("%d\n",sizeof(a)/sizeof(a[0]));
setNum(a);
}

void setNum(int *p,int a)


{
*p = a;
}

void setNum(int *p)


{

int Num = sizeof(p)/sizeof(p[0]);
printf("%d\n",Num);
}
結果是,輸出分別是4和1.
原因分析:
1.對于第一個輸出,由于在main函數中定義的為數組,所以可以直接利用sizeof函數來求出a數組的長度。
2.對于傳遞參數類型,比如上面的setNum函數(未傳遞個數版本),此時,調用該函數的時候,a退化為一個普通的指針,也就是說,此時sizeof(p)求出來的就是一個指針的大小,除以int的大小,恰好為1.
啟示:
C語言中,不能夠根據一個數組指針就求出來任意一個數組的大小。解決辦法就是傳第一個參數進來,指定大小。
ps:參考資料(詳實):
http://topic.csdn.net/t/20060205/18/4540750.html摘錄:
> 如果作為函數的參數是沒法求的,
> 但這樣是可以的:
>
> #define LENGTH(s) (sizeof(s) / sizeof(int))
>
> int s[12];
> int length = LENGTH(s);
==================================================
這樣的方法只能用于數組變量的數組名,對于指向數組的指針,以及作為參數的數組名都是沒有效果的,上面已經有人解釋了
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
不可能有辦法的。
當你定義一個數組的時候:
int a[] = {1, 2, 3}; // 實際上被編譯為 int a[3] = {1,2,3}
數組名代表的是數組的地址。注意 —— 你絕對沒有辦法通過數組名動態獲得數組的大小。當你丟失a的長度信息的時候,你永遠不可能知道他的長度。
那么 sizeof 是怎么回事呢?他不是通過 a 的名字獲得 a的大小了么? —— 大錯特錯!
關鍵字 sizeof 產生的是一個編譯期常量(注1) 他的運作方式是這樣的:
當你寫:
sizeof a
實質是:
sizeof ( a的類型 )
而a的類型是什么呢?編譯器察看 a的定義發現, 是 int [3]
就是說,這里 sizeof a 實質是:
sizeof ( int[3] )
完全等同于常量 12 (假定int為4字節)。
考慮一個函數
void func( int a[] );
// 寫成 int a[3] 也不會有本質區別——也許你該試試寫成 int (&a) [3] ?
C++規定,數組作為形參的時候,a代表數組首地址。
他的底層意義是: a 退化為了一個4字節的指針,沒有任何變量表示數組的大小會“自動”被傳遞進來。
我們看看這個時候 sizeof a是什么:
sizeof( 函數形參的a[] ) = sizeof( int* const ) = 4 // 當然a[]不是合法的C++類型
仍然不服氣?好——我們反問一個問題:若你是C /C++的設計者, 你怎么在兼容原有設計的基礎上讓void func( int a[] )同時傳遞地址和大小?
首先,a是一個變量,而且類似數組。他必須是一個地址,否則你不知道如何索引元素。
他怎么再帶上一個變量表示他的大小呢?
擴充 sizeof (a) 的能力?
sizeof a 必須產生代碼——不管是常量還是什么。 要讓他在運行時決定 a的值, a就必須帶上他的大小信息。
1 你必須修改C標準,讓C支持“兩種”數組。一種是定義處的數組,他分配大片連續內存,和原來的C標準相同。
2 另一種是作為參數傳遞數組。 你必須傳遞地址和數組大小;這個數組實際上是一個8字節的結構{ 地址; 大小}(事實上可能更加復雜,考慮多緯數組如何實現? )
3 系統必須根據兩種不同數組分別實現其 []、* 、&等。 原有的數組根據其首地址偏移(這是個常量)和下標尋址; 而參數數組則首先取“地址”內容(這是個變量),然后根據這個地址尋址....
厄... 再考慮多維數組——聽起來這不是一整套vector模型么?
-----------------------------------------------
注1: 對于C99支持的 flexible array ,其 sizeof 運算是運行時求值
posted on 2011-03-01 17:14
deercoder 閱讀(11729)
評論(0) 編輯 收藏 引用 所屬分類:
C++