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

如何用void函数初始化二维数组?指针传递问题排查

问题分析与修正方案

核心错误点

  • 参数类型不匹配:main中定义的table是char (*)[10](指向包含10个char的数组的指针),但你传给函数的是它的地址(即char (**)[10]类型),而原函数参数声明为char*,类型完全不兼容,会导致未定义的指针操作。
  • 值传递陷阱:原函数中直接给table = A只是修改了函数内部的形参副本,不会影响main里的实参。C语言是值传递,要修改外部的指针变量,必须传递指针的指针。
  • 函数名笔误:原函数名asssignTable多了一个s,虽不影响运行,但属于低级错误,建议修正。

修正后的代码

#include <stdio.h>
#include <stdlib.h>

char A[10][10] = {
        {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'},
        {'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'},
        {'U', 'V', 'W', 'X', 'Y', 'Z', '.', ',', '!', '?'},
        {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'},
        {'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'},
        {'U', 'V', 'W', 'X', 'Y', 'Z', '.', ',', '!', '?'},
        {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'},
        {'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'},
        {'U', 'V', 'W', 'X', 'Y', 'Z', '.', ',', '!', '?'},
        {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'}
};

char B[10][10] = {
        {' ', 't', 'a', 'b', 'c', 'f', 'g', 'z', 'j', 'm'},
        {' ', 't', 'a', 'b', 'c', 'f', 'g', 'z', 'j', 'm'},
        {' ', 't', 'a', 'b', 'c', 'f', 'g', 'z', 'j', 'm'},
        {' ', 't', 'a', 'b', 'c', 'f', 'g', 'z', 'j', 'm'},
        {' ', 't', 'a', 'b', 'c', 'f', 'g', 'z', 'j', 'm'},
        {' ', 't', 'a', 'b', 'c', 'f', 'g', 'z', 'j', 'm'},
        {' ', 't', 'a', 'b', 'c', 'f', 'g', 'z', 'j', 'm'},
        {' ', 't', 'a', 'b', 'c', 'f', 'g', 'z', 'j', 'm'},
        {' ', 't', 'a', 'b', 'c', 'f', 'g', 'z', 'j', 'm'},
        {' ', 't', 'a', 'b', 'c', 'f', 'g', 'z', 'j', 'm'}
};

void printTable(int rows, int columns, char table[rows][columns])
{
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < columns; j++)
            printf("%c", table[i][j]);
        printf("\n");
    }
    printf("\n");
}

// 修正参数类型:接收指向二维数组指针的指针
void assignTable(char (**table)[10], char* table_identity)
{
    if (table_identity[0] == 'A')
        *table = A; // 解引用修改外部的指针变量
    else if (table_identity[0] == 'B')
        *table = B;
    printf("In the function \"assignTable\":\n");
    printTable(10, 10, *table); // 传递解引用后的指针给printTable
}

int main()
{
    char (*table)[10];
    assignTable(&table, "A"); // 传指针的地址
    printf("In main :\n");
    printTable(10, 10, table);

    return 0;
}

关键修改说明

  1. 参数类型调整:将函数参数改为char (**table)[10],明确接收指向char (*)[10]类型指针的地址,解决类型不兼容问题。
  2. 修改实参而非形参:用*table = A代替table = A,通过解引用操作直接修改main中table变量的取值,让赋值结果能传递回主函数。
  3. 修正函数调用:函数内调用printTable时传递*table,匹配printTable所需的二维数组指针类型。

内容的提问来源于stack exchange,提问作者3nondatur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:05:09