[英]passing a pointer to a statically allocated matrix into a function - c
目前,我有下面的代碼可以工作:
/*int f_ls(char **buffer, unsigned int max_files);*/
char buffer_tmp[LS_MAX_FILES][MAX_FILENAME_LENGTH];
char *buffer[LS_MAX_FILES];
int i = 0;
while(i < LS_MAX_FILES)
{
buffer[i] = buffer_tmp[i];
i++;
}
int r = f_ls(buffer, LS_MAX_FILES);
但是我想,為什么將二維數組傳遞給像只有一個維的函數那樣隱式地衰減到指針呢?
第二個不太有趣的問題:是否有更干凈的方法來做我所缺少的上述工作? 似乎很多代碼只是為了初始化要傳遞給函數的東西。
我相信在c ++中,您可以使用new進行一些更整潔的操作,但這仍然有些笨拙。
“二維”數組的確會衰減到指針,但是會衰減到指向數組的指針:
char (*ptr_to_buffer_tmp)[MAX_FILENAME_LENGTH]
為什么將二維數組傳遞給像只有一個維的函數那樣的函數時,它不會隱式衰減到指針?
2D數組可以看作是1D數組的數組。 將其名稱傳遞給函數會將其轉換為指向2D數組的第一個1D數組(元素)的指針。
第二個不太有趣的問題:是否有更干凈的方法來做我所缺少的上述工作? 似乎很多代碼只是為了初始化要傳遞給函數的東西。
是。 您所做的與傳遞2D數組的名稱類似。
int r = f_ls(buffer_tmp, LS_MAX_FILES);
您的二維數組:
char buffer_tmp[LS_MAX_FILES][MAX_FILENAME_LENGTH];
無法衰減到指向指針數組的指針,因為這對於內存表示是什么意思? 您的buffer_tmp如下所示:
H E L L O W O R L D
S O M E T H I N G
O K
而您的緩沖區如下所示:
0x1234 -> "HELLO WORLD"
0x5678 -> "SOMETHING"
0x9abc -> "OK"
我希望這對您有所幫助:在一個地方,您有一個矩形的字符,在另一個地方,您有一個指向其他位置的字符串的指針矢量。 您嘗試使用的函數簽名根本不支持前者,並且不能同時支持兩者(不能在C中使用,請嘗試使用Fortran!)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.