【问题标题】:Remapping C pointer to a 3D array将 C 指针重新映射到 3D 数组
【发布时间】:2019-03-14 15:40:52
【问题描述】:

我正在尝试获取指向数组整数的指针,以便稍后在函数中临时重新映射,以节省自己的指针数学。我试图查看是否有其他问题回答了它,但我无法重现 hereherehere 描述的方法。

从根本上说,我只想暂时处理一个整数组和一个 3D 数组,以确保我不会弄乱指针数学。 (我目前正在查看这个,因为之前的代码对内存的分配不一致)。

#include <stdlib.h>
#define GROUPCOUNT 16
#define SENSORCOUNT 6
#define SENSORDIM   3
int main()
{
int *groupdata = (int *)calloc(GROUPCOUNT * SENSORCOUNT * SENSORDIM,sizeof(int));
int sensordata[SENSORCOUNT*SENSORDIM];
sensordata[7] = 42;  //assign some data 
int (*group3d)[GROUPCOUNT][SENSORCOUNT][SENSORDIM] = groupdata; //<---Here is the problem
group3d[1][5][1] = sensordata[7];  //I want to do this
free(groupdata);
}

在上面的示例中,我想暂时将 groupdata 处理为 group3d 以进行分配,但我似乎无法将自己包裹在演员阵容中。我目前有宏来执行指针数学以强制执行正确的结构,但如果它只是在代码中,那么当我传递它时会更好。任何建议将不胜感激。

注意: 3D cast 将在程序内部以函数方式使用。该示例只是我尝试整理代码的最小可行程序。

【问题讨论】:

  • 到底是什么错误?尝试使用种姓。为什么要动态创建 3 维数组?而是将内存分配给 int * ?
  • @Mazhar 该数组被分配了一个int *,但被传递,并且深度中的函数方式将由3D演员提供。有道理的错误是main.c:11:7: warning: incompatible pointer types initializing 'int (*)[16][6][3]' with an expression of type 'int *'
  • 是的,这是预期的。您正在为int (*)[16][6][3] 分配一个简单的int *。或者更具体地说,group3d 的类型为 int (*)[16][6][3],而 groupdata 的类型为 int *。所以你不能直接分配它。虽然你可以使用演员表。在您的情况下,如果您将 group3d 直接分配为 3D 数组,您仍然可以将此单个指针传递给其他函数,就像您传递 groupdata 一样,但这次您不必担心尺寸。此外,group3d 是一个大小为普通指针的单指针。它不是任何 3d 指针数组。

标签: c


【解决方案1】:

group3dint (*group3d)[GROUPCOUNT][SENSORCOUNT][SENSORDIM] 定义时,那么*group3d 是一个三维数组。这样您就可以将它与(*group3d)[1][5][1] 一起使用。

要将其与group3d[1][5][1] 一起使用,您需要将group3d 作为指向二维数组的指针:

int (*group3d)[SENSORCOUNT][SENSORDIM] = (int (*)[SENSORCOUNT][SENSORDIM]) groupdata;

(在将 int 的数组别名为 int 的数组的数组时,存在一些关于 C 语义的技术问题,但这在具有默认设置的普通编译器中不是问题。但是,它会是最好始终将内存用作int数组的数组,而不是int的数组。)

【讨论】:

  • 从您的 cmets 中,最好只使用我的宏来进行指针数学运算?我假设编译器在做数学运算时会更可靠。
【解决方案2】:
  int l = 5, w = 10, h = 15;
  int Data = 45;
  int *k = malloc(l * w * h * sizeof *k);
  // not use this k[a][b][c] = Data;
  //use this is right
   k[a*l*w + b*l + c] = Data;

【讨论】:

    【解决方案3】:

    在上面的示例中,我想将 groupdata 处理为 group3d 临时分配任务,我似乎无法包裹自己 围绕铸件。

    一种可能的解决方案是像这样动态创建一个多维数组。这样您就不必铸造东西或担心尺寸。

    int (*group3d)[GROUPCOUNT][SENSORCOUNT][SENSORDIM] = calloc(1, sizeof(int [GROUPCOUNT][SENSORCOUNT][SENSORDIM]));
    
    (*group3d)[1][5][1] = sensordata[7];  //I want to do this
    
    /* Then you can print it like */
    printf("%d\r\n", (*group3d)[1][5][1]);
    

    【讨论】:

    • 这将非常失败——不会有错误消息但*group3d[1][5][1] 将访问错误的内存;它应该是(*group3d)[1][5][1]。这不是问题所要求的;该问题要求对元素的访问采用group3d[1][5][1] 的形式,而不是*group3d[1][5][1](*group3d)[1][5][1]
    • 感谢您指出问题。虽然我已经检查过它正在工作。
    猜你喜欢
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    相关资源
    最近更新 更多