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

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(使用前将#替换为@)

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

随机推荐

  • 什么是 __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 数组 因此我想通过结构将其作为指针传递 但它不起作用 我想知道为什