Pae*_*ula 3 c macros dynamic multidimensional-array
我正在尝试malloc一个巨大的4d阵列(192 gig可用); 但是进入的内容与出来的内容不匹配(请参阅下面的代码中的assert()).(我定义的尺寸很小;但实际数字是:20,9000,195,120)
#define SIZE_A 1
#define SIZE_B 3
#define SIZE_C 4
#define SIZE_D 2
#define offSet(a,b,c,d) ( ((size_t) SIZE_A * SIZE_B * SIZE_C * a) + ((size_t) SIZE_B * SIZE_C * b) + ((size_t) SIZE_C * c) + d)
void xall(void)
{
int *aray = (int *) malloc( (size_t) SIZE_A * SIZE_B * SIZE_C * SIZE_D * sizeof(int));
int counter = 0;
for (int a = 0; a < SIZE_A; ++a){
for (int b = 0; b < SIZE_B; ++b){
for (int c = 0; c < SIZE_C; ++c) {
for (int d = 0; d < SIZE_D; ++d){
aray[ offSet(a,b,c,d) ] = counter++;
}}}}
counter = 0;
for (int a = 0; a < SIZE_A; ++a){
for (int b = 0; b < SIZE_B; ++b){
for (int c = 0; c < SIZE_C; ++c) {
for (int d = 0; d < SIZE_D; ++d){
int value = aray[ offSet(a,b,c,d) ] ;
assert(value == counter++);
}}}}
}
Run Code Online (Sandbox Code Playgroud)
正如其他人所提到的,你的宏是错误的.修复这很好,但我建议你直接分配一个多维数组,而不是手动滚动偏移宏.看看这个例子:
#include <assert.h>
#include <stdlib.h>
#define SIZE_A 1
#define SIZE_B 3
#define SIZE_C 4
#define SIZE_D 2
int main(void)
{
int counter = 0;
int (*array)[SIZE_A][SIZE_B][SIZE_C][SIZE_D] =
malloc(sizeof(int) * SIZE_A * SIZE_B * SIZE_C * SIZE_D);
for (int a = 0; a < SIZE_A; ++a)
for (int b = 0; b < SIZE_B; ++b)
for (int c = 0; c < SIZE_C; ++c)
for (int d = 0; d < SIZE_D; ++d)
(*array)[a][b][c][d] = counter++;
counter = 0;
for (int a = 0; a < SIZE_A; ++a)
for (int b = 0; b < SIZE_B; ++b)
for (int c = 0; c < SIZE_C; ++c)
for (int d = 0; d < SIZE_D; ++d)
{
int value = (*array)[a][b][c][d];
assert(value == counter++);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中分配的数组的内存中布局与你的问题中完全相同,但为什么不让编译器为你工作呢?
除了一点编辑之外 - 不要malloc()在C程序中转换调用的返回值.转换来自void *隐式,并且具有显式转换可以隐藏您将获得的隐式函数声明警告 - 例如,如果您忘记包含stdlib.h.
| 归档时间: |
|
| 查看次数: |
278 次 |
| 最近记录: |