C:多维数组上的静态到动态分配

C:多维数组上的静态到动态分配,c,malloc,typedef,C,Malloc,Typedef,我目前使用的是使用多维数组的遗留代码: #define B 25 int Table[A][B][C][D][E][F]; 我需要用一个动态值来改变B常数。问题是,我需要保持表与以前相同的方式,这样我就不会有任何其他东西,只有重写分配 我想听听你对如何做这件事的看法/意见 目前,我正试图在分配时键入定义表的结尾([C][D][E])以malloc它,但我遇到了一些错误,关于表没有按照遗留代码的要求进行处理 //int32_t Table[A][B][C][D][E][F]; int32_t*

我目前使用的是使用多维数组的遗留代码:

#define B 25
int Table[A][B][C][D][E][F];
我需要用一个动态值来改变B常数。问题是,我需要保持表与以前相同的方式,这样我就不会有任何其他东西,只有重写分配

我想听听你对如何做这件事的看法/意见

目前,我正试图在分配时键入定义表的结尾([C][D][E])以malloc它,但我遇到了一些错误,关于表没有按照遗留代码的要求进行处理

//int32_t Table[A][B][C][D][E][F];
int32_t* Table[A];

typedef int32_t type_1_t[E][F];
typedef type_1_t type_2_t[C][D];

for (int i = 0; i < A; i++)
  Table[i] = (int32_t*) malloc (sizeof (type_2_t) * dynamic_B);
#定义大小B(C*D*E*F*sizeof(int32\t))
int32_t****表[A];
或(int i=0;i
编辑2:上面的代码完全不起作用,完全是垃圾。留下它作为一个提醒,在我发布之前彻底检查代码

编辑3:这就像一个魅力在这里,最后:)

#定义大小B(C*D*E*F*sizeof(int))
typedef int t2[C][D][E][F];
t2*ar[A];
int-dynB=3;
对于(int i=0;i
#定义大小B(C*D*E*F*sizeof(int32\t))
int32_t****表[A];
或(int i=0;i
编辑2:上面的代码什么都不做,完全是垃圾。留下它作为提醒,在我发布之前要彻底检查代码

编辑3:这就像一个魅力在这里,最后:)

#定义大小B(C*D*E*F*sizeof(int))
typedef int t2[C][D][E][F];
t2*ar[A];
int-dynB=3;

对于(int i=0;i您的类型错误:

int32_t* Table[A];
实际上应该是

int32_t (*Table[A])[C][D][E][F];
或者,正如你所说

type_2_t *Table[A];

这应该可以解决问题。

您输入了错误的类型:

int32_t* Table[A];
实际上应该是

int32_t (*Table[A])[C][D][E][F];
或者,正如你所说

type_2_t *Table[A];
这应该可以解决问题。

眼睛疼!
为什么不将其声明为int******表,并将其malloc为5个嵌套for循环?这样,如果任何其他维度决定变为动态维度,您将得到未来的证明:)

Table=malloc(A*sizeof(int*****));
因为(i=0;i眼睛受伤!
为什么不将其声明为int******表,并将其malloc为5个嵌套for循环?这样,如果任何其他维度决定变为动态维度,您将得到未来的证明:)

Table=malloc(A*sizeof(int*****));


对于(i=0;i旧代码想要什么?错误是什么?使用每个维度的表。当前我得到的错误是“下标值既不是数组也不是指针也不是向量”这可能来自我的typedefs或mallocs,这就是为什么我没有发布我现在正在尝试的代码。如果旧代码将此表视为多维数组,我不知道它如何处理具有非连续内存区域的解决方案,因为它将尝试通过简单的解引用访问您的表。旧代码想要什么?什么是错误吗?使用每个维度的表。目前我得到的错误是“下标值既不是数组也不是指针也不是向量”这可能来自我的typedefs或mallocs,这就是为什么我没有发布我现在正在尝试的代码。如果旧代码将此表视为多维数组,我不知道它如何处理非连续内存区域的解决方案,因为它将尝试通过简单的解引用访问您的表。我将无法访问表u用这个唱多维度!我想要遗留代码(使用表[a][b][c][d][e][f])工作…这是胡说八道。你把一个指向数组的指针转换为指向指针的指针,这真的不会做正确的事情。@jpalecek是的,你是对的,它编译并打印了,所以我认为它工作了,但我知道当我检查它时打印了0xCDCDCD。不能责怪一个人试图欺骗编译器:)您将需要分配每个维度,而不仅仅是其中一个维度。我将无法使用多个维度访问此表!我希望遗留代码(使用表[a][b][c][d][e][f])能够工作……这是胡说八道。您将一个指向数组的指针转换为指向指针的指针,但这并不会做正确的事情。@jpalecek是的,您是对的,它编译并打印了,所以我认为它有效,但我检查它时知道它打印了0xCDCD。不能责怪一个人试图欺骗编译器:)你需要分配每个维度,而不仅仅是其中一个维度。这似乎并不能解决问题,我在使用表[a][b][c][d][e][f]时仍然会遇到相同的错误。typedef'd版本不起作用,第一个是编译的,但segfault(在我的代码中)。ideone上的代码测试了[0][0][0][0][0]地址通常是好的(意味着不管你做什么都可以用)对于segfaults,检查你没有跨过索引的范围。好的,不管是typedef'd版本,它确实可以用:)这似乎不能解决问题,我在使用表[a][b][c][d][e]时仍然会遇到同样的错误。typedef'd版本不起作用,第一个版本可以编译,但是segfault(在我的代码中)。ideone上的代码测试[0][0][0][0]地址,这通常是好的(意味着可以工作)不管你做什么…对于segfaults,检查你没有跨过索引的范围。好的,不管对于typedef的版本,它确实有效:)我不想使用这个解决方案,因为我很懒(写循环)还有明显的性能问题。那么你是在某个内部循环中分配这个数组吗?如果只分配一次,性能差异应该不会太大。我想,如果你今天懒惰,它会在两个月后影响你:)我在程序后面访问表时谈论性能问题。我不想使用这个解决方案打开,因为我很懒(写循环)还有明显的性能问题。那么你是在某个内部循环中分配这个数组吗?如果只分配一次,性能差异应该不会太令人讨厌。我想,如果你今天懒惰,它会在两个月后咬你:)我将在程序后面访问表时讨论性能问题。
Table = malloc(A * sizeof(int *****));
for (i=0; i<A; ++i)
{
  Table[i] = malloc(B * sizeof(int ****));
  for (i1=0; i1<B; ++i1)
  {
     ...
  }
}