【问题标题】:C convert int 2d array to void * then back to int 2d arrayC 将 int 2d 数组转换为 void * 然后返回到 int 2d 数组
【发布时间】:2016-06-22 10:23:44
【问题描述】:

如何转换初始化的 int 2d 数组,如下所示:

int 2darray[9][9];

进入一个 void * 然后再次回到一个二维数组。这个给我一个不兼容的指针类型错误

int **sub = *((int **)2darray);

【问题讨论】:

  • 可能是int darray[9][9]; void *sub = darray; int **subInt = (int **)sub; AFAIK,变量不能以数字开头。它总是一个字符或 $ 或 _
  • 我实际上是在像这样的 pthread_create(&column, NULL, columncheck, (void*)darray); 传递一个 pthread。但是当我做这样的事情时它给了我一个分段错误: printf("%d ", subInt[0][0]);
  • 可能不是转换问题。你能分享整个代码来检查问题吗?因为由于某些核心转储而发生分段错误。可能是对地址的无效访问(由于也没有正确初始化指针)。
  • 我刚刚决定使用 malloc 之前对我有用的方法。 Patrick Trentin 说我不能将 ponter 投射回数组。

标签: multidimensional-array casting int void


【解决方案1】:

int** 的强制转换应该是这样的:

int **sub = ((int **)2darray);

您不能将指针转换回数组,这没有任何意义。但是,您可以将指针转换回数组指针,如此处https://stackoverflow.com/a/20046703/6024122 所示。如该答案所述,这很罕见,我从未亲眼目睹过。

ETA:pthread_create 要求其参数为 void *arg,因此您应该执行以下操作:

pthread_create(..., (void *) 2darray);

然后

int **ptr = (int**) arg;

【讨论】:

  • 好吧,我同意它可能没有意义的部分。但是,将数组转换为指针是有效的。在内部它们是相同的。您可以查看我的评论以获取将成功编译的示例代码。
  • 将数组转换为指针确实有意义,没有意义的是指向数组的指针,甚至不可能。据我所知,充其量您可以将其转换为数组指针。
  • 对不起,我的意思是指向数组本身的指针。它完全有效。就像我说的那样,他们在一天结束时会得到同样的处理。它们直接访问地址并根据分配的基本字节递增。示例:int a[2]; // Initialize with something. 你可以cout << *(a+1) 这等于cout << a[1]。同样,您也可以将指向数组的指针分配给指向数组的指针。
  • 恐怕我们说的不是同一件事,这就是您解决指针索引的方式。我的意思是实际上做类似 int a[2] = ptr;
  • 好吧,你是对的。我们在不同的背景下。我在谈论转换和访问。没关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 2016-12-08
  • 2012-06-08
  • 2020-02-27
  • 2022-07-14
相关资源
最近更新 更多