C:“传递不兼容的指针类型”警告很重要?/将多维数组传递给函数

2023-12-06

我想编写一个带有指向多维数组的指针的函数。例如:

#include <stdio.h>

void print_matrix(int channel, int row, int column, int *matrix);

int main(void) {
    int test[4][5][6];
    int counter = 1;
    for (int channel = 0; channel < 4; channel++) {
        for (int row = 0; row < 5; row++) {
            for (int column = 0; column < 6; column++) {
                test[channel][row][column] = counter;
                counter += 1;
            }
        }
    }

    print_matrix(4, 5, 6, test);
}

void print_matrix(int channel, int row, int column, int *matrix) {
    for (int chn = 0; chn < channel; chn++) {
        for (int r = 0; r < row; r++) {
            for (int c = 0; c < column; c++) {
                printf("%d ", *(matrix + (chn * row * column + r * column + c)));
            }
            printf("\n");
        }
        printf("\n\n");
    }
}

但是当我编译代码时,编译器给出了以下警告。

warning: incompatible pointer types passing 'int [4][5][6]' to parameter of type 'int *' [-Wincompatible-pointer-types]

在我问问题之前,我搜索了警告并找到了不同的解决方案。喜欢

void print_matrix(int channel, int row, int column, int matrix[channel][row][column]) ...

如果我没记错的话,我知道 C 将数组作为顺序保存。例如:

int holder[2][3][4]; // is equal to int holder[24] in ram
                     //holder[0][1][0] is equal to *(holder + 4)

我的问题是这个警告很重要吗?如果我知道该怎么做,我可以忽略这个警告吗?


这种警告非常重要:在大多数情况下,它表明潜在的未定义行为。

在您的特定情况下,因为您知道物体的几何形状,并且test衰减为指向其第一个元素(二维矩阵)的指针,该指针恰好与指向第一个矩阵元素的指针具有相同的值,您的代码具有预期的行为。

然而,显式传递指向第一个矩阵元素的指针会是更好的风格:

int main(void) {
    int test[4][5][6];
    int counter = 1;
    for (int channel = 0; channel < 4; channel++) {
        for (int row = 0; row < 5; row++) {
            for (int column = 0; column < 6; column++) {
                test[channel][row][column] = counter;
                counter += 1;
            }
        }
    }

    print_matrix(4, 5, 6, &test[0][0][0]);
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C:“传递不兼容的指针类型”警告很重要?/将多维数组传递给函数 的相关文章

随机推荐

  • ORA-00911: 无效字符 Toad

    我用的是蟾蜍11 5 当我运行多个 truncate 语句时 它给出一个错误ORA 00911 无效字符 truncate table employees truncate table employees edit history trun
  • 如何在 IIS7 中设置应用程序的默认页面?

    我将 Web 应用程序部署到 IIS7 一切正常 但是 我希望它自动转到 www xxxxxx com views root default aspx 而不是输入真正的起始页的 url 我该怎么做呢 只需转到 web config 文件并添
  • 允许 python 子进程的多个输入

    我有一个与几年前提出的问题几乎相同的问题 有两个输入的 Python 子进程收到了一个答案但没有实施 我希望这份报告可以帮助我和其他人澄清问题 如上所述 我想使用 subprocess 来包装一个需要多个输入的命令行工具 特别是 我想避免将
  • sizeof() 如何通过引用参数传递

    我将一个数组传递给函数并尝试查找该数组的长度 但结果却出乎意料 有人可以解释一下吗 int main int array 10 0 func array return 0 void func int arr printf length of
  • 使用 Vue.js 在 .then 函数中输入错误

    我有一个获取请求来检测用户是否是管理员 我的问题是我想使用显示一个按钮v if检查它是真是假 默认情况下该值设置为false Data 然后我们得到了按钮 And the then in beforeCreate 你需要使用一个箭头函数以保
  • Go 中的 int 字符串? [复制]

    这个问题在这里已经有答案了 我真的认为这会很简单 string myInt 看来不是 我正在编写一个函数 它接受一个整数切片 并将每个整数附加到一个字符串中 并在每个整数之间添加一个分隔符 这是我的代码 func xis Int16Slic
  • 为什么栈是有界的?

    在我使用过的任何平台上 堆栈大小始终是有限的 您必须在某个时刻 在程序启动之前 指定最大堆栈大小 并且它是预先分配的 为什么堆栈不能是驻留在堆内存中的链表 那么它几乎是无限的 它是当今所有计算机体系结构的固有属性吗 我的问题与任何特定的编程
  • C 程序 77% 的时间都花在 _platform_memmove$VARIANT$Haswell 中 [已关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我正在分析一些用 C 编写的数字代码 分析器是 Instruments 编译器是clang在 Mac OSX 10 11 6 上 多达 77 3 的运行时间花费在 platform mem
  • Java ProcessBuilder 具有多个带空格的参数

    我知道关于从 java 执行进程有很多已解决的问题 但我无法使用提供的答案解决我的问题 我正在尝试从 java 应用程序创建 postgresql 数据库备份 我使用以下代码 ProcessBuilder probuilder new Pr
  • 针对特定用户的 Firebase 数据库规则

    我有一个数据库 我需要对所有用户进行读取访问 并且 在用户运行的应用程序脚本中调用时的写访问权限 电子邮件受保护 我的 firebase 结构是 ABC AAA1 date ABC AAA2 date ABC AAA3 date ABC A
  • 滞后时间序列数据

    我正在寻找建立一个用于预测的神经网络模型 我试图让我的数据采用图像中显示的格式 以便模型可以根据 2 天前 1 天前 今天 的先前值进行预测 这些值将在第二天针对下一个预测进行调整 例如如图所示 第一次输入的 1 天前变为第二次输入的 2
  • ExtJS:Grid 和 Form 之间的两种方式绑定

    我正在尝试学习 ExtJS 但有点卡在一个地方 我想创建一个顶部有网格 底部有表单的屏幕 我想将它们彼此绑定 以便当我从网格中选择一行时 会填充表单字段 网格中具有相同的记录 并且当我更改网格或表单中的任何内容时 另一侧也会更新 到目前为止
  • 动态地将内容添加到线性布局?

    例如 如果我定义了一个方向为垂直的根线性布局 main xml
  • Java新手需要数据库连接方面的帮助

    我是 Java 新手 甚至是 Java 数据库连接新手 当我将其放入 Main 类中时 我已成功创建数据库连接并查询表 现在我已将其移至名为 Connection 的新类中 但出现错误 package lokate import java
  • 开发蓝牙 (AVRCP 1.4) iPhone 应用程序需要了解哪些规格

    我是 iPhone 开发新手 我将参与一个项目 其中我必须开发一个支持蓝牙的 iPhone 应用程序来控制车辆音响和 DVD 播放器 该车辆配有物理遥控器 IR 该项目的目的是用支持蓝牙的 iPhone 应用程序取代 IR 以控制 IR 的
  • Lambda 捕获和参数同名 - 谁隐藏了另一个? (clang 与 gcc)

    auto foo You re using g auto compiler detector foo auto foo std puts foo compiler detector You re using clang 铿锵 3 6 0和较
  • 合并“NSManagedObjectContextDidSaveNotification”后,NSFetchedResultsController 未显示所有结果

    我有一个 NSFetchedResultsController 它使用谓词获取对象 isTrash NO 大多数情况下 这会按预期工作 但是当对象未被破坏时 获取的结果控制器不会获取未被破坏的对象 出了什么问题 发生这种情况的原因是由于me
  • ES 模块导入不起作用

    我正在尝试制作普通 ES 导入导出的简单示例 索引 js main js import foo from mathModule console log foo mathModule js export const foo Math sqrt
  • 使用具有不同行结束样式的 m 标志来匹配行结束位置

    我试图用标签包装以 开头的每一行 尝试实现类似 GitHub Stackoverflow 的文本格式化语法 这就是我得到的 value preg replace m p 1 p value 经过谷歌搜索很长一段时间后 这似乎是正确的解决方案
  • C:“传递不兼容的指针类型”警告很重要?/将多维数组传递给函数

    我想编写一个带有指向多维数组的指针的函数 例如 include