访问预定义数组时代码崩溃

标签 c arrays pointers

我无法理解为什么我的代码在访问数组时崩溃。将函数参数转换为 int[3][3] 而不是 int** 时,我没有遇到任何问题,但我不明白为什么,因为 int** 我给出的参数是一个有效的指针,它指向 main

中定义的本地内存
typedef struct {const unsigned int m; const unsigned int n;} mat_size;

void print_mat(int** mat, mat_size s){  // <-- faulty version
    int i,j;
    for(i = 0; i < s.m; i++){
        for(j = 0; j < s.n; j++){
            printf("%d ", mat[i][j]);
        }
        printf("\n");
    } 
    printf("=============");
}


int main(int argc, char** argv) {

    int matrix[3][3] = {{1,4,2},{7,-1,15},{33,-10,-1}};
    mat_size s = {3,3};
    print_mat(matrix, s);  

    while(1);
    return 0;
}

void print_mat(int mat[3][3], mat_size s){  // <-- good version
    int i,j;
    for(i = 0; i < s.m; i++){
        for(j = 0; j < s.n; j++){
            printf("%d ", mat[i][j]);
        }
        printf("\n");
    } 
    printf("=============");
}

最佳答案

函数参数的类型与传递的矩阵不匹配,因为 matrix[3][3] 不是 int** 而是 (*i​​nt )[3]

根据评论,您还希望矩阵具有动态大小,因此您可以使用 VLA 来做到这一点:

#include <stdio.h>

typedef struct
{
    const unsigned int m;
    const unsigned int n;
} mat_size;

void print_mat(mat_size s, int (*mat)[s.n])
{
    unsigned int i, j;
    for (i = 0; i < s.m; i++)
    {
        for (j = 0; j < s.n; j++)
        {
            printf("%d ", mat[i][j]);
        }
        printf("\n");
    }
    printf("=============\n");
}

int main(int argc, char** argv)
{

    int matrix[3][3] = { { 1, 4, 2 }, { 7, -1, 15 }, { 33, -10, -1 } };
    mat_size s = { 3, 3 };
    print_mat(s, matrix);

    return 0;
}

关于访问预定义数组时代码崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42803110/

相关文章:

c - 将非 ASCII 字符写入 tty 上程序的标准输入(通过 ssh)

c - 调用静态库函数时出现段错误

java - 如何将 Arraylist 转换为 2D double[][] 数组

c++ - 为什么指针不能转换为引用?

c++ - 我应该怎么做才能获得 'dynamic' 数组的大小?

c - 在函数调用的参数内部定义新函数、数组、结构等

php - C 中是否有与 PHP 中相同的运算符 ===?

c - 如何将小部件放入网格内的任何列?

javascript - 计算某种颜色是否属于给定颜色的同一族

javascript - AngularJS 将数组转换为 JSON