调用C函数readMyData需传入哪些参数?不熟悉指针该如何定义变量?
问题解答
首先明确C语言参数规则
C语言中,函数参数列表里的数组形式声明(比如uint8_t status[])和指针声明(uint8_t *status)是完全等价的,编译器会统一将数组形式的参数处理为指针类型,所以注释里标注的指针类型是准确的。
你当前的写法存在问题,不可用
问题出在两点:
- 你定义的
uint8_t *status, *data, *crc是三个未初始化的指针,没有指向任何可写入的有效内存空间,函数写入数据时会触发非法访问 - 调用时传入的
&status是指针的地址,类型为uint8_t **,和函数要求的uint8_t *参数类型完全不匹配,编译就会报类型错误,就算强制编译通过运行也会崩溃
正确的调用写法
优先推荐在栈上直接分配对应大小的变量/数组,不需要手动管理内存,适合新手使用:
- 先根据函数要求确定每个参数需要的内存长度:
- status只需要存储1个字节的状态值
- data的长度根据你的业务逻辑确定(比如如果是4字节转换结果就设为4,按需调整)
- crc只需要存储1个字节的校验值
- 定义变量并调用:
// 定义变量,直接分配栈内存 uint8_t status; uint8_t data[4]; // 数组长度按你实际需要的data字节数修改 uint8_t crc; int32_t result = 0; // 调用函数:普通变量传地址,数组名本身就是首地址直接传 result = readMyData(&status, data, &crc);
如果你确实需要使用指针变量,要先给指针分配有效的堆内存,用完记得释放:
uint8_t *status = malloc(sizeof(uint8_t)); uint8_t *data = malloc(4 * sizeof(uint8_t)); uint8_t *crc = malloc(sizeof(uint8_t)); int32_t result = 0; // 直接传指针变量即可,不需要额外取地址 result = readMyData(status, data, crc); // 业务逻辑处理完后释放内存,避免泄漏 free(status); free(data); free(crc);
内容的提问来源于stack exchange,提问作者Hal M
相关产品推荐
相关产品推荐

