C语言无返回值函数修改传入数组失败问题求助
问题分析与解决方案
你的代码里有几个关键问题导致tx_buffer1无法正确获取数据,我来一步步帮你修正:
1. 函数参数类型不匹配
你定义的函数参数unsigned char *data[40]是一个指针数组(存储40个unsigned char指针的数组),但调用时传入的&tx_buffer1是char (*)[40](指向40个char数组的指针),类型完全不匹配,这是核心问题。我们需要把参数改成指向unsigned char的指针(或者和数组类型一致的char指针),因为数组名本身可以隐式转换为指向首元素的指针。
2. EEPROM地址写入错误
你写的i2c_write(address*0xff);是错误的,要获取地址的低字节应该用按位与操作address & 0xff,*0xff会把地址乘以255,完全偏离了正确的低字节地址。
3. 数组索引与解引用错误
原代码里的*data[i+4]存在两个问题:一是因为参数类型错误导致的指针操作错误,二是没必要偏移+4,直接从数组的起始位置写入即可;另外数组索引的优先级高于解引用,*data[i]等价于*(data[i]),这不是你想要的写入数组元素的操作。
修正后的完整代码
修正后的函数定义
// 把参数改成unsigned char*(或者char*,和tx_buffer1类型匹配) void eeprom_read_page(unsigned int address, unsigned char length, unsigned char *data) { unsigned char i; i2c_start(); i2c_write(EEPROM_BUS_ADDRESS_W); i2c_write(address >> 8); // 写入地址高字节 i2c_write(address & 0xff); // 修正:获取地址低字节 i2c_start(); i2c_write(EEPROM_BUS_ADDRESS_R); for(i = 0 ; i < (length - 1) ; i++) { data[i] = i2c_read(1); // 直接写入数组的第i个元素 } data[length - 1] = i2c_read(0); // 最后一个元素用NACK读取 i2c_stop(); }
修正后的调用方式
因为tx_buffer1是char数组,我们可以直接传数组名(数组名会隐式转换为指向首元素的指针),如果担心类型不匹配,可以做强制转换:
// 直接传tx_buffer1即可,或者强制转换为unsigned char* eeprom_read_page( (rx_buffer1[1] * 256) + rx_buffer1[2], rx_buffer1[3], (unsigned char*)tx_buffer1 );
数组定义(可以保持不变,或者统一为unsigned char更严谨)
#define RX_BUFFER_SIZE1 40 // 建议统一为unsigned char,避免符号扩展问题 unsigned char rx_buffer1[RX_BUFFER_SIZE1], tx_buffer1[RX_BUFFER_SIZE1];
关键修改说明
- 函数参数改为
unsigned char *data:这样传入的数组首地址可以直接用来访问和修改数组元素,完全符合你“无返回值修改传入数组”的需求。 - 修正地址低字节的获取方式:
address & 0xff才能正确提取地址的低8位,保证EEPROM寻址正确。 - 移除不必要的索引偏移:直接从
data[0]开始写入数据,确保数据从数组的起始位置存储。 - 最后一个元素的索引修正:原代码里的
lengh+3是错误的,应该是length-1,因为循环已经处理了前length-1个元素,最后一个元素对应索引是length-1。
这样修改后,函数就能正确地把EEPROM读取到的数据写入tx_buffer1数组里了。
内容的提问来源于stack exchange,提问作者Elyas Behroozizade




