You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 23:51:15