关于一维数组作为函数传参的大小

编写网络通信代码时,数组作为实参传入子函数,获取传参的大小与数组实际大小不同,导致程序在发送数据时出现错误,为避免今后重复犯此错误,现记录如下:
一般情况下,定义一个数组,如:char message[16]; 
使用sizeof()获取message数组大小:sizeof(message) 的值为16
若定义一个函数,其形参为一个数组,如:
char message_outside[16];
void function(char msg[16])
{
 int len1,len2;
 char message_inside[16];
 …

len1 = sizeof(message_inside);
len2 = sizeof(msg);
printf(“len1:%d , len2:%d\n”,len1,len2);
}
message_outside[16]作实参传给funciton,运行function(message_outside)
输出为:len1:16 , len2:4
可见,数组作实参传入函数时,是作为指针传入,使用sizeof()获取其大小为4,而非数组本身的大小,编程时需注意。
### C语言中二维数组作为指针传递给函数的方法 在C语言中,可以通过多种方式将二维数组作为指针传递给函数。以下是几种常见的方法及其对应的代码示例。 #### 方法一:通过固定列数的指针传递 当传递二维数组时,如果已知其固定的列数,则可以直接将其视为指向特定长度一维数组的指针。这种方式需要显式声明每行的列数。 ```c #include <stdio.h> void printArray(int (*arr)[3], int rows) { for (int i = 0; i < rows; ++i) { for (int j = 0; j < 3; ++j) { printf("%d ", arr[i][j]); } printf("\n"); } } int main() { int array[2][3] = {{1, 2, 3}, {4, 5, 6}}; printArray(array, 2); return 0; } ``` 上述代码展示了如何将二维数组 `array` 的地址传递给函数 `printArray`,其中 `(*arr)[3]` 表明每一行是一个包含三个整数的一维数组[^1]。 --- #### 方法二:通过双层指针传递 另一种常见的方式是使用双重指针(即指针的指针),这允许更加灵活地处理动态分配的二维数组。 ```c #include <stdio.h> #include <stdlib.h> void printArray(int **arr, int rows, int cols) { for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { printf("%d ", arr[i][j]); } printf("\n"); } } int main() { int row = 2, col = 3; int *array[row]; // 动态分配内存 for (int i = 0; i < row; ++i) { array[i] = malloc(col * sizeof(int)); for (int j = 0; j < col; ++j) { array[i][j] = i * col + j + 1; } } printArray((int **)array, row, col); // 释放内存 for (int i = 0; i < row; ++i) { free(array[i]); } return 0; } ``` 此代码片段演示了如何利用双重指针 `(int **)` 来表示二维数组,并且支持动态分配和释放内存的操作[^2]。 --- #### 方法三:通过单级指针加偏移计算 还可以将整个二维数组展平为一维数组的形式进行操作,此时只需提供一个单一的指针即可完成任务。 ```c #include <stdio.h> #define ROWS 2 #define COLS 3 void printArray(int *arr, int rows, int cols) { for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { printf("%d ", *(arr + i * cols + j)); } printf("\n"); } } int main() { int array[ROWS][COLS] = {{7, 8, 9}, {10, 11, 12}}; printArray(&array[0][0], ROWS, COLS); return 0; } ``` 这里展示了一种基于线性索引的技术,即将二维数组映射到连续存储空间上,从而简化了参数列表的设计[^3]。 --- ### 总结 以上三种方法各有优劣: - 如果知道确切的列宽,推荐采用**方法一**; - 对于需要频繁调整尺寸的情况,建议选用**方法二**中的动态分配策略; - 而对于追求极致性能的应用场景来说,可能更适合运用**方法三**所描述的手动展开技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值