结构体动态数组和函数调用 f(const struct_type *const data[])

2023-12-15

以下代码警告类型不兼容。解决此代码的正确方法是什么?

thanks

typedef struct a_struct struct_type;

void f(const struct_type *const data[], unsigned n);

void test(unsigned n)
{
   struct_type **v;

   assert(n);
   v = malloc(n * sizeof(struct_type *));
   /* fill v with new struct_type (with a malloc per entry) */
   f(v, n); <- WARN on v
}

编译器抱怨的原因是第一个const in f的声明。

尝试使用

void f(struct_type *const data[], unsigned n);
/*...*/
f( v, n );

并且您不会收到相同的警告。或者,您可以投射v你打电话时f

void f(const struct_type *const data[], unsigned n);
/*...*/
f( (const struct_type * const *) v, n );

这有点违反直觉,但在 C 中,你不能传递pointer-to-pointer-to-nonconst for a pointer-to-pointer-to-const。他们破例允许你通过pointer-to-nonconst for a pointer-to-const.

这是一个常见问题解答“为什么我不能通过char **到一个期望的函数const char **?":

您可以使用pointer-to-T(对于任何类型T)其中一个pointer-to-const-T是期待。但是,允许限定指针类型中存在轻微不匹配的规则(显式例外)不会递归应用,而仅在顶层应用。 (const char ** is pointer-to-pointer-to-const-char,因此该例外情况不适用。)

您无法分配的原因char **值对一个const char **指针有些晦涩。鉴于const限定符确实存在,编译器希望帮助您信守不修改的承诺const价值观。这就是为什么你可以分配一个char * to a const char *,但反之则不然:这显然是安全的add const-ness 是一个简单的指针,但是把它拿走是危险的。但是,假设您执行了以下一系列更复杂的作业:

const char c = 'x';     /* 1 */
char *p1;           /* 2 */
const char **p2 = &p1;      /* 3 */
*p2 = &c;           /* 4 */
*p1 = 'X';          /* 5 */

在第 3 行中,我们分配了一个char ** to a const char **。 (编译器应该抱怨。)在第 4 行中,我们分配了一个const char * to a const char *;这显然是合法的。在第 5 行中,我们修改了char *指向——这应该是合法的。然而,p1 最终指向 c,即const。这发生在第 4 行,因为 *p2 实际上是 p1。这是在第 3 行中设置的,这是不允许的表单赋值,这正是第 3 行不允许的原因。

分配一个char ** to a const char **(如第 3 行和原来的问题)并不是立即危险的。但它造成了一种情况,即 p2 的承诺——最终指向的值不会被修改——无法兑现。

(C++ 有更复杂的赋值规则const- 限定指针,允许您进行更多类型的分配而不会产生警告,但仍然可以防止无意的修改尝试const价值观。 C++ 仍然不允许分配char ** to a const char **,但它会让你逃脱分配char ** to a const char * const *.)

在 C 中,如果必须分配或传递在第一级间接寻址之外具有限定符不匹配的指针,则必须使用显式强制转换(例如 (const char **)在这种情况下),尽管与往常一样,对这样的强制转换的需要可能表明强制转换并不能真正解决更深层次的问题。

参考文献: ISO Sec. 6.1.2.6,秒。 6.3.16.1,秒。 6.5.3 H&S Sec. 7.9.1 第 221-2 页

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

结构体动态数组和函数调用 f(const struct_type *const data[]) 的相关文章

  • 将 SQL Server varBinary 数据转换为字符串 C#

    我需要帮助弄清楚如何转换来自SQL服务器表列设置为varBinary 最大 转换为字符串以便将其显示在标签中 这是在C 我正在使用数据读取器 我可以使用以下方式提取数据 var BinaryString reader 1 我知道该列包含之前
  • 如何在 C# 中知道 PID 和 VID 来发现虚拟 COM 端口名称

    如果我知道 PID 和 VID 我会尝试找到查找 COM 端口名称的正确方法 到目前为止 我写了解决方法 但我不相信没有更优雅和正确的方法 顺便说一句 我知道我可以使用 REGEX 编写此代码只是为了测试解决方法 我知道还有很大的改进空间
  • c# - 显示小数点到小数点后 6 位 [重复]

    这个问题在这里已经有答案了 可能的重复 具有 N 个小数位的 Double ToString https stackoverflow com questions 3059759 double tostring with n number o
  • 在 C# 中轻松创建支持索引的属性

    在 C 中我发现索引属性 http msdn microsoft com en us library aa288464 VS 71 aspx非常有用 例如 var myObj new MyClass myObj 42 hello Conso
  • WPF Dispatchertimer 延迟反应/冻结

    在我的 WPF 应用程序中 我使用 3 个不同的 DispatcherTimers 一种是用于显示当前时间 一种是每 5 秒运行一次数据库查询 第三个每 1 秒刷新一次自定义按钮的值 当我的程序运行时 有很多延迟 冻结 例如 时间开始正确计
  • 计算复杂数组的abs()值的最快方法

    我想计算 C 或 C 中复杂数组元素的绝对值 最简单的方法是 for int i 0 i lt N i b i cabs a i 但对于大向量来说 速度会很慢 有没有办法加快速度 例如使用并行化 语言可以是 C 或 C 鉴于所有循环迭代都是
  • boost::asio::io_service 是否保留处理程序的顺序?

    Does boost asio io service http www boost org doc libs release doc html boost asio reference io service html保证处理程序的调用顺序与
  • 修剪 UIImage 边框

    这是我想要修剪的图像的示例 我想去掉图像周围的边框 在本例中是顶部和底部的黑条 我在Github上找到了一个库 CKImageAdditions https github com cmkilger CKImageAdditions 但是它似
  • 如何使用 ProtoGen 从 proto 文件生成结构

    我们一直在使用 protobuf net ProtoGen 从 proto 文件生成 C cs 文件 我们希望代替类来生成结构 例如 DataContract public struct Entity1 ProtoMember 1 publ
  • 为什么 httpRuntime targetFramework="4.5" 禁止抓取 .ASPXAUTH cookie?

    当我的 web config 具有以下 httpRuntime 时 我的控制器无法获取 cookie ASPXAUTH 它似乎能够获取任何其他 cookie 无论带或不带句点前缀 如果我删除下面的行 它就可以正常工作
  • Nuget - 对象引用未设置为对象的实例

    我在 vs 2015 中遇到了 nuget 包管理器的问题 像Unity这样的一些包已经安装没有问题了 某些软件包 例如 EF 在安装时出现问题 像 Automapper 这样的一些软件包也有同样的问题 但是当我安装这个软件包的另一个版本时
  • 为什么我无法调试动态加载的程序集?

    我正在开发一个 Web API 项目 该项目使用内部模拟框架 允许拦截和修改来自控制器的响应 它使用 MEF 加载包含某些先决条件匹配时执行的代码的程序集 我知道这是正常工作的 因为我可以在响应中看到模拟已被执行 但由于某种原因我无法调试动
  • 我可以对(非成员)函数使用部分模板特化吗?

    我试图在 非成员 函数上使用部分模板专业化 但我在语法上遇到了问题 我在 StackOverflow 中搜索了其他部分模板专业化问题 但这些问题涉及类或成员函数模板的部分专业化 作为起点 我有 struct RGBA RGBA uint8
  • 如何在asp.net core 6中注入IConfiguration

    web api 应用程序中不再有 Startup cs 我们以前可以注入IConfiguration进入那个Startup class public class Startup public Startup IConfiguration c
  • #define 内存地址声明

    这个 define 语句有什么作用 它用于定义内存地址 但我不明白 uint32 t 部分 define GPxDAT uint32 t 0x6FC0 通常用于访问映射到地址空间的硬件寄存器 或者一些特定的内存地址 硬件寄存器应定义为vol
  • 如何组合||条件语句中的运算符[重复]

    这个问题在这里已经有答案了 代替 if foo 1 foo 5 foo 9 我喜欢将它们组合起来 类似于以下内容 这不起作用 if foo 1 5 9 那可能吗 不幸的是不是 你最好的选择是创建一个扩展方法 public static bo
  • C# 3.0 中自动属性和公共字段的区别

    我无法理解为什么 C 3 0 中存在自动实现的属性语言功能 当你说的时候有什么区别 public string FirstName than public string FirstName get set 因为它们在生成的 IL 代码 和机
  • 在Framework 4.6项目中使用.net core DLL

    我已经在 net core 2 0 中构建了一个 DLL 现在我想在使用 net 4 6 1 框架的 WinForms 项目中使用它 我可以引用该 dll 但收到 System IO FileLoadException 表示找不到 Syst
  • 是否可以编写一个在另一个 Windows 应用程序中选择文本时收到通知的 Windows 应用程序?

    我很好奇是否可以编写一个程序来监视我的文本选择 一种可能的用途是编写一个与编辑器 IDE 无关的代码格式化程序 应用程序 服务 P 启动并以某种方式挂接到窗口中 以便在任何窗口中选择文本时收到通知 启动其他一些应用程序 A 用户选择 A 中
  • DataGridView 捕获用户行选择

    我在处理选择时遇到问题DataGridView 我的网格视图包含一个金额列 表单上有一个文本框 应显示所选网格视图行的总数 因此 我需要在用户选择 取消选择 gridview 行时捕获事件并相应地计算 添加 减去 金额 我找到了两种方法 使

随机推荐

  • 切片和数组有什么区别?

    为什么两者都是 u8 and u8 3 在这个例子中好吗 fn main let x u8 1u8 2 3 println x let y u8 3 1u8 2 3 println y 事实是 T n 可以强迫 T 这是让他们可以忍受的方面
  • 无法使用 PHP 执行多个 MariaDB 查询

    我在 MariaDB 中执行 SQL 查询时遇到了一个小问题 所有 PHP 变量都不为空 我想同时执行两个查询 在 MySQL 中它可以工作 但在 MariaDB 服务器中我不能 因为我收到错误 我有一个查询 UPDATE users SE
  • 如何使用vb.net表单删除MS Access数据库的记录以及如何使用vb.net表单进入受密码保护的数据库

    我是 vb net 的新手 而且还是一名学生 我创建了一个表单来在 vb net 中输入学生注册详细信息 以满足教育需求 我使用 MS Access 2010 创建了一个数据库并将其链接到我的 vb 表单 它工作正常 我可以通过 vb ne
  • C# 有 Handles 关键字吗?

    Protected Sub Menu1 MenuItemClick ByVal sender As Object ByVal e As System Web UI WebControls MenuEventArgs Handles Menu
  • 累积和的条件计数数据框 - 循环列

    我试图根据每个值的符号在数据帧内重置来计算累积和 这个想法是对每一列分别进行相同的练习 例如 假设我有以下数据框 df pd DataFrame A 1 1 1 1 1 1 1 1 1 1 1 1 B 1 1 1 1 1 1 1 1 1 1
  • Flutter(Dart):渲染引起的异常/RenderFlex溢出

    我遇到 Flutter Dart RenderFlex 像素溢出问题 渲染库的一个例外 如何管理或应用滚动功能到我的应用程序页面视图 并避免 Flutter 的渲染异常 并显示以下消息 RenderFlex 底部溢出了 28 个像素 如果您
  • 如何编写单个 LINQ to XML 查询来迭代所有子元素以及子元素的所有属性?

    我正在开发 asp net 移动应用程序 我使用 XML 作为数据库 我正在 net 中使用 LINQ to XML 查询 XML 以访问所需的元素和属性 我的 XML 文件中有以下部分
  • Vim 中 Tab 键 == 4 个空格并在大括号后自动缩进

    我该如何制作vi Vim永远不要使用制表符 将空格转换为制表符 不好 使制表符键 4 个空格 并在大括号块后自动缩进代码 例如Emacs does 另外 如何保存这些设置 这样我就不必再次输入它们 我见过与此相关的其他问题 但它似乎总是与我
  • Jmeter是否支持客户端javascript

    Jmeter是否支持客户端javascript 我能够录制脚本 但重播日志没有显示任何内容 JMeter 不是一个浏览器 它是一个负载生成工具 它可以产生 HTTP 流量 但它实际上并不解析 执行加载页面附带的 JavaScript 如果您
  • 在 Switch Case 中声明 UI 对象

    我读过有关开关盒范围的内容 跳转标签等等 但是 SO 这里建议的解决方案似乎意味着添加花括号可以避免这个问题 然而 这似乎仍然不起作用 switch objectType case label label is an integer con
  • 删除NiFi中的空属性

    因为这个问题仍未解决 我有一个EvaluateJsonPath有时输出带有空字符串的属性的处理器 是否有直接的方法从流程文件中删除属性 我尝试使用UpdateAttributes处理器 但它只能根据匹配属性名称进行删除 我需要匹配属性的值
  • 类的事件监听器?

    我有一个引用 Id 的 EventListener 它运行良好 唯一的问题是我至少有十几个需要引用此 EventListener 的地方 所以我不想有十几个完全相同但具有不同 Id 的脚本 有没有办法让 EventListener 引用一个
  • 如何在谷歌地图上显示浮动视图,就像谷歌地图中的搜索栏一样

    我已经成功实现了地图 但我找不到任何与此相关的帮助 这是我对谷歌地图片段的实现 SupportMapFragment fragment private GoogleMap map FragmentManager fm Override pu
  • 将 UTF8 转换为 std::wstring 的跨平台方法 [重复]

    这个问题在这里已经有答案了 可能的重复 STL 中 UTF8 与宽字符的转换 我知道如何使用将 UTF8 转换为 std wstring多字节到宽字符 std wstring utf8to16 const char src std vect
  • 8086中的物理地址是如何产生的?

    In the 8086架构中 内存空间大小为 1 MiB 并分为每个最大 64 KiB 的逻辑段 即它有20地址线因此使用以下方法 数据段寄存器左移4位然后添加到偏移寄存器 我的问题是 尽管所有寄存器都只有 16 位 但我们如何进行移位操作
  • 刷新服务引用会更新app.config

    每次我对 WS 进行更改并更新 Visual Studio 中的引用时 VS 都会使用其他不必要的信息覆盖我的 app config 因此 当我之后启动客户端时 我收到此错误 处理标头时发现错误 代码生成器所做的更改是remove每个绑定中
  • Xpage, createForm=false 禁用链接上的 SSJS 事件?

    我问这个只是为了在这里澄清 我不小心将 createForm 属性设置为 false 然后我期望一个链接事件应该打开另一个页面 但不再起作用 这是 SSJS 事件的预期行为吗 当您禁用表单创建时在链接中 正如 Per 提到的 所有事件都需要
  • Windows 窗体 - 单击按钮将数据添加到列表视图[重复]

    这个问题在这里已经有答案了 我有一个 winform 应用程序 点击后会填充一些数据 button UpdateTS 如何添加存储在变量中的数据 单击该按钮后可用 我想要在列表视图中显示的数据存储在一个名为的数组中 results butt
  • 公开声明中“iostat”参数的含义是什么?

    我对打开文件中使用 iostat 参数感到困惑 如上所述 当 open 命令成功时 iostat 的值为 0 open unit 99 file vel zcor22 txt status old iostat ierr err 100 1
  • 结构体动态数组和函数调用 f(const struct_type *const data[])

    以下代码警告类型不兼容 解决此代码的正确方法是什么 thanks typedef struct a struct struct type void f const struct type const data unsigned n void