将数组注释与指针一起使用

2024-04-07

我目前无法理解以下场景: 我有一个多维字符串数组,我想仅使用指针来解决它,但在指针上使用数组注释时我总是遇到分段错误。这只是一个示例代码,我想在 pthread 中使用 3D 数组,因此我想通过结构将其作为指针传递,但它不起作用,我想知道为什么?我认为指针和数组在功能上是等效的?这是示例代码:

#include <stdio.h>

void func(unsigned char ***ptr);

int main() {
  // Image of dimension 10 times 10
  unsigned char image[10][10][3];
  unsigned char ***ptr = image;

  memcpy(image[0][0], "\120\200\12", 3);

  // This works as expected
  printf("Test: %s", image[0][0]);

  func(image);

  return 0;
}

void func(unsigned char ***ptr) {
  // But here I get a Segmentation Fault but why??
  printf("Ptr: %s", ptr[0][0]);
}

在此先感谢您的帮助 :)


我想也许strdup使问题变得混乱。指针和数组是not总是等价的。让我尝试演示一下。我总是避免实际的多维数组,所以我可能会在这里犯错误,但是:

int main()
{
  char d3Array[10][10][4]; //creates a 400-byte contiguous memory area 
  char ***d3Pointer; //a pointer to a pointer to a pointer to a char.
  int i,j;
  d3Pointer = malloc(sizeof(char**) * 10);
  for (i = 0; i < 10; ++i)
  {
    d3Pointer[i] = malloc(sizeof(char*) * 10);
    for (j = 0; j < 4; ++j)
    {
      d3Pointer[i][j] = malloc(sizeof(char) * 4);
    }
  }
  //this
  d3Pointer[2][3][1] = 'a';
  //is equivalent to this
  char **d2Pointer = d3Pointer[2];
  char *d1Pointer = d2Pointer[3];
  d1Pointer[1] = 'a';


  d3Array[2][3][1] = 'a';
  //is equivalent to 
  ((char *)d3Array)[(2 * 10 * 4) + (3 * 4) + (1)] = 'a';
}

一般来说,我使用分层方法。如果我想要连续的内存,我自己处理数学......就像这样:

  char *psuedo3dArray = malloc(sizeof(char) * 10 * 10 * 4);
  psuedo3dArray[(2 * 10 * 4) + (3 * 4) + (1)] = 'a';

更好的是,我使用像这样的集合库uthash.

请注意,正确封装数据会使实际代码非常容易阅读:

typedef unsigned char byte_t;
typedef struct
{
  byte_t r;
  byte_t g;
  byte_t b;
}pixel_t;

typedef struct
{
  int width;
  int height;
  pixel_t * pixelArray;
}screen_t;

pixel_t *getxyPixel(screen_t *pScreen, int x, int y)
{
  return pScreen->pixelArray + (y*pScreen->width) + x;
}

int main()
{
  screen_t myScreen;
  myScreen.width = 1024;
  myScreen.height = 768;
  myScreen.pixelArray = (pixel_t*)malloc(sizeof(pixel_t) * myScreen.height * myScreen.width);
  getxyPixel(&myScreen, 150, 120)->r = 255;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将数组注释与指针一起使用 的相关文章

  • Web API 复杂参数属性均为 null

    我有一个 Web API 服务调用可以更新用户的首选项 不幸的是 当我从 jQuery ajax 调用中调用此 POST 方法时 请求参数对象的属性始终为 null 或默认值 而不是传入的值 如果我使用 REST 客户端调用相同的方法 我使
  • 在 IEnumerable 中查找相同的集合

    有一项任务要弄清楚如何更新表 DataTable 连接到一个database没有UPDATE陈述 我想出的例子是从邮箱中读取警报 该表将写入 Alerts 如果邮件正文包含单词 SUCCESS gt Alert 变为绿色 如果 FAIL g
  • 在 std::forward 中它如何接受右值?

    看看斯科特 迈耶的有效的现代 C 第200 201页 建议的简化实施std forward可能是 在其他地方看到了正确的实现 template
  • 如何使用 Regsvr32 注册 .NET COM DLL?

    我有一个使用 COM DLL 的 VB6 应用程序 该DLL是用C 编写的 在 C 项目属性中 我检查了 Register for COM interop 选项 VB6 应用程序在我的开发机器上运行良好 C 代码完全遵循以下格式 CodeP
  • C# 中 value 为匿名类型的字典

    是否可以在 C 中创建一个System Collections Generic Dictionary
  • std::make_shared 作为默认参数无法编译

    在 Visual C 2008 和 2010 中 以下代码无法编译并出现以下错误 include
  • 需要帮助将 winform 迁移到 net 5

    我正在将 winform 应用程序从 net core 3 1 移植到 net 5 并收到以下错误 严重性代码 说明 项目文件行抑制状态 错误NETSDK1136 目标平台必须设置为Windows 通常 通过在 TargetFramewor
  • 使用 openssl 库获取 x509 证书哈希

    我目前正在开发一个应用程序 它使用 openssl 库 libcrypto 来生成证书 现在我必须获取现有证书的哈希值 当我使用终端时 我可以使用以下命令生成哈希值 openssl x509 hash in cert pem noout 输
  • Javascript:如何过滤对象数组并对结果求和

    我有一个对象数组 var example a 1 b 2 c 3 a 4 b 5 c 6 a 7 b 8 c 9 我正在尝试添加所有不对应的值c 我已经设法用 console log test filter x gt x c gt 3 过滤
  • 在 4.x 内核上的 64 位内存中查找系统调用表

    我正在尝试编写一个简单的内核模块来查找 Linux 中的 sys call table 但遇到了一些麻烦 我在这里找到了 32 位 Linux 的基本指南 https memset wordpress com 2011 03 18 sysc
  • BlueZ D-Bus C,应用 BLE

    我正在尝试编写一个应用程序来搜索附近的蓝牙设备并与它们通信 我的应用程序将用 C 语言编写 并打算在 Linux 下工作 是否有通过 C 中的 D Bus 使用 BlueZ 的教程或示例 此应用程序的目的是从 BLE 中的文件发送数据 你能
  • System.IndexOutOfRangeException:索引超出了数组的范围[重复]

    这个问题在这里已经有答案了 我正在开发一个 ATM 软件作为家庭作业 我想知道今天处理的交易总量 为此我编写了以下代码 public decimal getDayTransaction int accountid string date s
  • 获取 Blob 图像并将该图像转换为 Bitmap 图像

    我正在从数据库中获取 blob 格式的图像 我想将其转换为位图图像 我用来将位图转换为 Blob 的代码放在下面 但是请告诉我如何反转它 ByteArrayOutputStream boas new ByteArrayOutputStrea
  • 实例着色器矩阵的设置

    我想绘制实例立方体 我可以打电话GL DrawArraysInstanced PrimitiveType Triangles 0 36 2 成功地 我的问题是所有立方体都绘制在相同的位置和相同的旋转 我如何为每个立方体单独更改它 要创建不同
  • 隐式类型转换 - 编译器错误

    这个问题与this https stackoverflow com questions 3529449 can i make the ternary operator treat my class like a bool问题 下面的代码在V
  • 如何设置扬声器声音增强设置

    如何以编程方式设置 Windows 扬声器设置 增强 选项卡 中可用的声音效果 恐怕这是不可能的 参见 Maurits 对他的评论blog http blogs msdn com b matthew van eerde archive 20
  • 所有区域的启用保护模式必须设置为相同的值(启用或禁用)

    我正在尝试使用Selenium Internet Explorer驱动程序 但当我尝试实例化它时它崩溃了 TestInitialize public void TestInitialise ieDriver new InternetExpl
  • 为 winforms ComboBox 中的单个项目着色?

    我遇到了一个困境 我有一个表单 其中包含许多组合框 其中包含在某些情况下可能无效 过时的信息 选项 项目 我不能简单地从项目中删除过时的信息 但我确实想在选项无效时为用户提供视觉线索 我正在考虑对项目进行着色 可能是红色 来指示它们是否无效
  • Perl:散列 2 中数组的数值排序(施瓦茨变换)

    这实际上是该线程的后续内容 Perl 散列中数组的数字排序 https stackoverflow com questions 7914931 perl numerical sort of arrays in a hash 我无法编辑原始问
  • 如何找到数组中的最小数字并返回该数组的主索引?

    我有一个如下所示的数组 我想找到 diff 索引中数字最小的数组 所以在这种情况下 我想取回数组 7 我需要的只是数组编号 即 7 而不是任何其他信息 我知道我可以使用 array column 轻松找到最小的数字 但如何返回整个数组索引

随机推荐

  • 什么是 __meteor_bootstrap__?

    我刚刚开始使用 Meteor 并致力于现有的项目 我遇到了其中一个软件包 observatory apollo 的问题 该软件包具有以下行 meteor bootstrap app use Observatory logger TLog u
  • C# 中是否有像 Java 中那样的 throws 关键字? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在 C 中使用 Java 风格的 throws 关键字 https stackoverflow com questions 3465465 how to use java style throws
  • 如何以编程方式创建 Func<> 委托

    我有一个小型依赖注入框架 我正在尝试解决它Lazy lt gt 动态实例 我们的想法是做这样的事情 DIContainer Register
  • 使用自定义段变量设置 ASP.Net MVC 4 路由

    我刚刚开始开发一个具有几个区域的应用程序 基本网格主控 详细信息类型系统 我正在考虑利用 MVC 中良好的路由功能 特别是 4 但我 只是不明白 我相信 目前唯一定义的路线是基本路线 routes MapRoute Default cont
  • 根据多个键控列将缺失行添加到 data.table

    我有一个data table包含指定唯一情况的多个列的对象 在下面的小例子中 变量 name job and sex 指定唯一的 ID 我想添加缺失的行 以便每个案例对于另一个变量的每个可能实例都有一行 from 如同expand grid
  • mod_fcgid:多线程 FastCGI 现在还是计划中的未来?

    迄今为止的事实 根据 mod fcgi 不是 mod fastcgi 的替代品 http www apachelounge com viewtopic php t 4385 and mod fcgid 和多线程 FastCGI 应用程序的问
  • 如何更改 networkx / matplotlib 图形绘制的属性?

    NetworkX 包括功能 http networkx lanl gov reference drawing html用于绘制图表使用绘图库 http matplotlib org 这是一个使用出色的 IPython Notebook 的示
  • 仅显示所需参数

    我创建了一个应用程序如下本教程 http geddyjs org tutorial 无脚手架 创建项目后 我可以单击它 它会显示一个大参数列表 像这儿 http s15 postimage org j6at9koiz parameters
  • 使用 python3.5 将 Arduino 的实时数据链接到 pyqt5 的 LCDNumber

    我对制作 GUI 还很陌生 我为一个项目设计了一个项目 我希望在数据从 Arduino 传入时更新 LCD 我正在使用 pyqt5 来转换我的 Qtdesigner GUI 问题是我不知道如何将传入数据链接到 GUI 目前 我有一个程序可以
  • 基于嵌套键值数组对弹性搜索查询进行排序

    我有一个 json uniqueKey 918084 dataValue metadata timestamps key startTime value 2017 02 07T18 00 00 06 00 key processedTime
  • 在不附加 GDB 的情况下获取所有线程的堆栈跟踪

    有没有一种方法可以在不附加 GDB 的情况下打印所有线程的堆栈跟踪 或者是否有一个命令可以用作 gdb 批处理模式来打印所有线程的堆栈跟踪 elfutils https sourceware org elfutils 除其他实用程序外 还包
  • 灵气文法可以作为灵业文法重复使用吗?

    我有一个 Qi 语法定义 用于解析输入 后来我有一个 Karma 生成器 以与输入类似的方式输出 这有可能吗 似乎解析器语法可以自动转换为生成器语法 include
  • tsc 在 dist 中创建 src 文件夹

    我有这个文件夹结构 src subdir1 subdir2 这是我的tsconfig json compilerOptions target es2015 module commonjs sourceMap true declaration
  • SSIS - 多表插入

    我正在使用 SSIS 将数据从 MS Access 复制到 SQL Server 我只会复制一次 这不是重复的任务 只有一张源表 Table Source 我想将数据插入两个表 Table1 和 Table2 Table1 包含一个主键 它
  • Apache - 如何获取 REMOTE_USER 变量

    之前我使用IIS服务器作为PHP服务器 目前 它是apache 在 IIS 上我可以访问该变量 SERVER REMOTE USER 它返回用户名和域 例如域 用户 但安装 XAMPP 后此变量不可用 我应该怎么做才能再次获得这个变量 我的
  • 如何在java中找到2D ArrayList的列的唯一值?

    import java util ArrayList import java util Arrays import java util List import java util Map import java util Set impor
  • 在 C# 中使用全局热键捕获按键

    我有一个在后台运行的应用程序 就像我可以将我的应用程序保留在系统托盘中一样 如果它保留在系统托盘上 我的应用程序将完成它的工作 每当用户按下 F10 或 F9 时 就会完成一些工作 我试过这个 public partial class Fo
  • 未使用的indexeddb数据库是如何清理的

    我使用 IndexedDB 作为本地存储 并且运行良好 由于过于详细的原因 这里无法详细介绍 我经常只创建一个数据库并使用它 但在某些情况下 我需要创建更多数据库 在其中一些情况下 这些额外的数据库可能最终会 孤立 或未使用 并且将来不再需
  • ViewStub'父视图组

    该异常的含义是什么 ava lang IllegalStateException ViewStub 必须有一个非空 ViewGroup viewParent 我正在创建一个视图存根数组并将它们添加到线性布局中 但此异常在运行时显示 for
  • 将数组注释与指针一起使用

    我目前无法理解以下场景 我有一个多维字符串数组 我想仅使用指针来解决它 但在指针上使用数组注释时我总是遇到分段错误 这只是一个示例代码 我想在 pthread 中使用 3D 数组 因此我想通过结构将其作为指针传递 但它不起作用 我想知道为什