c 赋值中的类型不兼容,指针有问题吗?

2024-01-12

您好,我正在使用 C,我有一个关于分配指针的问题。

struct foo
{
   int _bar;
   char * _car[SOME_NUMBER]; // this is meant to be an array of char * so that it can hold pointers to names of cars
}

int foofunc (void * arg)
{
   int bar;
   char * car[SOME_NUMBER];

   struct foo * thing = (struct foo *) arg;

   bar = thing->_bar; // this works fine
   car = thing->_car; // this gives compiler errors of incompatible types in assignment
}

car 和 _car 具有相同的声明,那么为什么我会收到有关不兼容类型的错误?我的猜测是,这与它们是指针有关(因为它们是指向 char * 数组的指针,对吧?),但我不明白为什么这是一个问题。

当我宣布char * car;代替char * car[MAXINT];它编译得很好。但我不知道当我需要使用索引访问某些信息时这对我有什么用处,稍后访问该信息会非常烦人。事实上,我什至不确定我是否采用正确的方法,也许有更好的方法来存储一堆字符串而不是使用 char * 数组?

编辑:我并不是想使用 INT_MAX (int 的最大值),它只是其他一些 int,大约是 20。


car and _car都是数组,并且不能在 C 中分配数组(除非数组嵌入到结构(或联合)中并且执行结构分配)。

它们也是指向 char 的指针数组,而不是指向 char 数组的指针。您在代码中编写的内容可能就是您想要的 - 您可以在数组中存储最多 MAXINT 名称的指针。但是,您应该正确地描述类型 - 作为指向 char 或 char 指针的指针数组。

指向字符数组的指针如下所示:

char (*car)[MAXINT];

指向字符指针数组的点(谢谢,Brian)看起来像:

char *(*car)[MAXINT];

Be careful of MAXINT; that could be a very large array (on Linux, <values.h> defines MAXINT as INT_MAX, which is at least 231-1).


代码如下:

struct foo
{
   int _bar;
   char * _car[MAXINT];
}

int foofunc (void * arg)
{
   int bar;
   char * car[MAXINT];
   struct foo thing = (struct foo *) arg;
   bar = arg->_bar; // this works fine
   car = arg->_car; // this gives compiler errors of incompatible types in assignment
}

对 bar 和 car 的分配根本不应该编译 -arg is a void *。你可能想使用thing以某种形状或形式。正如布莱恩指出的,那里也存在问题:

您要么想要:

int foofunc(void *arg)
{
    int bar;
    char *car[MAXINT];
    struct foo thing = *(struct foo *)arg;
    bar = thing._bar; // this works fine
    car = thing._car; // this is still an array assignment
    ...other code using bar and car...
}

或者你想要:

int foofunc(void *arg)
{
    int bar;
    char *car[MAXINT];
    struct foo *thing = (struct foo *) arg;
    bar = thing->_bar; // this works fine
    car = thing->_car; // this is still an array assignment
    ...other code using bar and car...
}

或者,确实:

int foofunc(void *arg)
{
    struct foo *thing = (struct foo *) arg;
    int bar           = thing->_bar; // this works fine
    char *car[MAXINT] = thing->_car; // this is still an array assignment
    ...other code using bar and car...
}

最后,处理数组赋值,在C中你可以合理地使用memmove()去做这个:

int foofunc(void *arg)
{
    struct foo *thing = (struct foo *) arg;
    int bar           = thing->_bar; // this works fine
    char *car[MAXINT];
    memmove(car, thing->_car, sizeof(car));
    ...other code using bar and car...
}

类似的功能memcpy()如果要复制的区域重叠,则不具有可靠的语义,而memmove()做;总是使用更简单memmove()因为它总是能正常工作。在 C++ 中,使用时需要小心memmove() (or memcpy())。在这段代码中,它足够安全,但理解其中的原因并非易事。

您确实需要注意,您只是在此处复制指针 - 您没有复制指针指向的字符串。如果其他东西改变了这些字符串,它会影响通过看到的两个值car以及调用代码中的变量。

最后一点 - 现在:您确定需要将函数的参数作为void *?它使代码容易遭受各种滥用,如果函数被声明为采用 'struct foo *' 代替(或者甚至是 'const struct foo *').

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

c 赋值中的类型不兼容,指针有问题吗? 的相关文章

随机推荐

  • ForEach-Object -Parallel 参数集无法解析

    使用 powershell 并执行以下操作时本文 https devblogs microsoft com powershell powershell foreach object parallel feature 运行以下示例会引发错误
  • ColdFusion 并从 MySQL 获取数据

    我正在 CF 网站上工作 需要从 MySQL 表中获取数据 我可以很好地创建 CFQuery 并检查返回的记录 但如何获取返回的记录并循环它们并从每行中的特定字段获取数据 我可以写 while if end if 等 我只是不记得如何访问数
  • 指向索引处向量的指针与迭代器

    我有一个矢量 myvec我在代码中使用它来保存内存中的对象列表 我在 正常 向量中保留一个指向当前对象的指针C时尚通过使用 Object pObj myvec index 如果 myvec 没有变得足够大以至于无法在某个过程中移动 那么这一
  • 使用 NodeJS 的 IExpress 安装后批处理未立即找到 NPM

    我正在尝试使用 iExpress 在我在 NodeJS 上创建的小脚本上安装依赖项 iExpress 包只需安装 Node 包 msiexec i node msi 然后运行安装后批处理 将 Javascript 放入 UserProfil
  • API 级别 19 上 grantUriPermission 中的 IllegalArgumentException

    下面这行代码 context getApplicationContext grantUriPermission packageName uri Intent FLAG GRANT PERSISTABLE URI PERMISSION 在 A
  • 为什么 mypy 拒绝我的“混合联合”类型声明?

    While 解决 Python 聊天中的半相关问题 https chat stackoverflow com transcript message 49920836 49920836 我在 mypy 中发现了一些我不理解的行为 from t
  • Hive 执行钩子

    我需要在 Apache Hive 中挂钩自定义执行挂钩 如果有人知道该怎么做 请告诉我 我当前使用的环境如下 Hadoop Cloudera 版本 4 1 2 操作系统 Centos 谢谢 阿伦 有多种类型的挂钩 具体取决于您要在哪个阶段注
  • setuptools、distribution 和 pip 之间如何相互关联?

    我一直在通过 Learn Python The Hard Way 第二版 一书自学 Python 在练习 46 中 它告诉我阅读 Pip Distribute 和其他一些软件包 pip 的文档足够清楚了 它允许我安装 卸载和升级软件包 阅读
  • ConcurrentHashMap:我们可以信任它吗?

    来自ConcurrentHashMap的文档 支持完全并发检索和可调整的更新预期并发的哈希表 我们能否完全相信ConcurrentHashMap线程安全操作吗 我正在使用 ConcurrentHashMap 将键与其值进行映射 我的键值对是
  • 是否可以在不使用格式化 printf 的情况下在 java 中进行精确转换? [复制]

    这个问题在这里已经有答案了 该行产生双值3 33333333335 System out println Average marks of name double sum 3 是否可以设置精度宽度 您可以使用DecimalFormat or
  • Glass 上的 Google Play 服务“不真实”

    我正在尝试获取用户在 Glass 上的当前位置 Calling mLocationClient connect 失败而没有任何解决方案 然后我检查了设备上是否可以使用 Google Play 服务 GooglePlayServicesUti
  • ASP.NET Core集成测试在本地工作,但在生产环境中运行时抛出空引用异常

    我有一个 ASP NET Core 2 2 Razor Pages Web 应用程序 我已经为以下内容编写了一些集成测试官方指南 https learn microsoft com en us aspnet core test integr
  • 将 Intent Web url 转换为 Android Intent

    我目前在我的应用程序中集成了一个 webview webview flutter 2 0 4 以进行支付流程 不幸的是 在某些时候启动了以下网址 intent payment Intent action ch twint action TW
  • 计算 R 中前两个主成分的最快方法是什么?

    我在用princomp在 R 中执行 PCA 我的数据矩阵很大 10K x 10K 每个值最多 4 位小数 在 Xeon 2 27 GHz 处理器上大约需要 3 5 小时和大约 6 5 GB 物理内存 由于我只想要前两个组件 是否有更快的方
  • Android 5.1 上的位置权限

    我们构建并部署了一个运行完美的基于位置的购物应用程序 直到我们发现我们的应用程序由于抛出安全异常而无法在 Android 5 1 1 设备上运行 经过一番研究后 我发现 Google 创建了一种在运行时请求权限的新方法 但没有看到任何明确的
  • 为什么我不能访问 TypeScript 私有成员?

    我正在研究 TypeScript 中私有成员的实现 我发现它有点令人困惑 Intellisense 不允许访问私有成员 但在纯 JavaScript 中 一切都在那里 这让我认为 TS 没有正确实现私有成员 有什么想法吗 class Tes
  • 在一个事务中执行两个不同的查询

    我正在尝试在一个中执行两个插入查询Statement 将它们放在一笔交易中 我正在看addBatch方法 但如果我理解正确的话 它可以与单个PreparedStatement使用不同的参数多次执行相同的插入 或者用于Statement对象向
  • Chrome扩展:访问background.html中的跨域iframe

    由于页面的复杂性 XHR 并不是真正的选择 我正在尝试编写一个扩展来抓取需要作为网页加载的网站 我想出的最佳解决方案是通过放置在background html 中的iframe 进行抓取 当满足目标页面上的某些条件时 扩展程序将向用户提供通
  • 在 32 位系统上使用 int64_t 而不是 int32_t 对性能有何影响?

    我们的 C 库当前使用 time t 来存储时间值 我开始在某些地方需要亚秒级精度 因此无论如何 那里都需要更大的数据类型 此外 在某些地方解决 2038 年问题可能会很有用 因此 我正在考虑完全切换到具有底层 int64 t 值的单个 T
  • c 赋值中的类型不兼容,指针有问题吗?

    您好 我正在使用 C 我有一个关于分配指针的问题 struct foo int bar char car SOME NUMBER this is meant to be an array of char so that it can hol