使用typedef定义int数组时出现不兼容指针类型C错误求助
问题解决:数组赋值的指针类型错误修复
错误核心原因
报错源于指针类型不兼容:
longint_t被定义为int[3],因此longint_t*是指向长度为3的int数组的指针(即int (*)[3])- 调用
do_assign(vars[i], &zero)时,vars[i]作为数组名,会隐式转换为指向数组第一个元素的指针(int*),与函数要求的longint_t*类型不匹配
此外代码还存在两个隐性问题:
do_assign中的循环条件i<=3会导致数组越界,因为INTSIZE=3,合法索引为0、1、2,应改为i<INTSIZE- 函数内
*var1[i]和*var2[i]的写法错误,var1是指向数组的指针,需先解引用再访问元素
修复方案
方案1:调整函数参数类型(推荐)
利用数组作为函数参数时会退化为指针的特性,直接让do_assign接收longint_t类型参数(本质等价于int*),调用时直接传递数组名即可:
#include <stdio.h> #include <stdlib.h> #define INTSIZE 3 /* max number of digits per integer value */ #define NVARS 26 /* number of different variables */ typedef int longint_t[INTSIZE]; // 修改参数类型为longint_t,等价于int* void do_assign(longint_t var1, longint_t var2); void zero_vars(longint_t vars[]); int main(int argc, char *argv[]) { longint_t vars[NVARS]; zero_vars(vars); for (int i=0; i<NVARS; i++){ for (int j=0; j<INTSIZE;j++){ printf("%d ", vars[i][j]); } printf("\n"); } return 0; } void zero_vars(longint_t vars[]) { int i; longint_t zero = {0}; for (i=0; i<NVARS; i++) { // 直接传数组名,无需取地址 do_assign(vars[i], zero); } } void do_assign(longint_t var1, longint_t var2) { // 修正循环条件,避免越界 for (int i=0; i<INTSIZE; i++){ var1[i] = var2[i]; } }
方案2:保留指针参数,传递数组地址
若需维持longint_t*参数类型,调用时需传递数组的地址,并调整函数内的元素访问方式:
#include <stdio.h> #include <stdlib.h> #define INTSIZE 3 /* max number of digits per integer value */ #define NVARS 26 /* number of different variables */ typedef int longint_t[INTSIZE]; void do_assign(longint_t *var1, longint_t *var2); void zero_vars(longint_t vars[]); int main(int argc, char *argv[]) { longint_t vars[NVARS]; zero_vars(vars); for (int i=0; i<NVARS; i++){ for (int j=0; j<INTSIZE;j++){ printf("%d ", vars[i][j]); } printf("\n"); } return 0; } void zero_vars(longint_t vars[]) { int i; longint_t zero = {0}; for (i=0; i<NVARS; i++) { // 传递数组地址,&vars[i]为longint_t*类型 do_assign(&vars[i], &zero); } } void do_assign(longint_t *var1, longint_t *var2) { for (int i=0; i<INTSIZE; i++){ // 先解引用指针得到数组,再访问元素 (*var1)[i] = (*var2)[i]; } }
关键知识点总结
- 用
typedef定义的数组类型(如longint_t)是数组类型,而非指针类型 - 数组名作为函数参数时,会自动退化为指向数组第一个元素的指针(如
int[3]数组退化为int*) - 指向数组的指针(
longint_t*即int (*)[3])与指向元素的指针(int*)属于不同类型,无法隐式转换
内容的提问来源于stack exchange,提问作者sun_dance
相关产品推荐
相关产品推荐

