将指向静态分配的矩阵的指针传递给函数 - c

时间:2014-03-05 12:24:16

标签: c arrays function initialization

目前我的代码有以下代码:

/*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 ++中,我相信,你可以用新的东西做一些稍微干净的东西,但这看起来仍然有点笨重。

3 个答案:

答案 0 :(得分:2)

A&#34;二维&#34;数组 会衰减到指针,但它会衰减到指向数组的指针:

char (*ptr_to_buffer_tmp)[MAX_FILENAME_LENGTH]

答案 1 :(得分:1)

  

为什么当传递到像只有一个维度的函数那样的函数时,二维数组不会隐式衰减到指针?

2D阵列可以看作是1D阵列的阵列。将其名称传递给函数会将其转换为指向2D数组的第一个1D数组(元素)的指针。

  

第二个稍微不那么有趣的问题:是否有一种更清洁的方式来做到这一点,我错过了?似乎很多代码只是初始化一些东西传递给一个函数。

是。您所做的与传递2D数组的名称类似。

int r = f_ls(buffer_tmp, LS_MAX_FILES); 

答案 2 :(得分:1)

您的二维数组:

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!)。