我在访问传递给函数的数组元素时遇到了一些问题。
#define N (128)
#define ELEMENTS(10)
typedef int (*arrayOfNPointers)[N];
因此,如果这是正确的,那么它是一种描述N
int
指针数组的数据类型。
我稍后单独初始化我的数组,如下所示:
arrayOfNPointers myPtrs = { 0 };
int i;
for (i=0; i<N; i++) {
myPtrs[i] = (int*)malloc(ELEMENTS);
}
然而,这失败并出现以下错误:
error: incompatible types when assigning to type 'int[128]' from type 'int *'
所以,我的语法似乎有些不对劲。但是在另一块代码中,我正在修改一些这样的结构的内容,我没有问题。
void doWork(void* input, void* output) {
int i,m,n;
arrayOfNPointers* inputData = (arrayOfNPointers*)input;
int* outputData = (int*)output;
for (m=0, n=0; n<nSamples; n++) {
for (i=0; i<nGroups; i++) {
outputData[m++] = (*inputData)[i][n];
}
}
}
这个阵列逻辑是否严重受损?
答案 0 :(得分:5)
typedef int (*arrayOfNPointers)[N];
所以,如果这是正确的,它是一个描述N个指向int的数组的数据类型。
我认为这是一个指向N个整数数组的指针,而不是指向整数的N个指针的数组....
这意味着以下行不符合您的预期...... myPtrs [i] =(int *)malloc(ELEMENTS); 因为myPtrs是指向N维数组的指针(在这种情况下是128个int的数组),myPtrs [i]是第i个n维数组。所以你试图分配一个指向数组的指针,这就是你得到msg的原因......
错误:从类型'int *'中分配类型'int [128]'时出现不兼容的类型
答案 1 :(得分:4)
我相信您正在寻找的是以下......
#define N 128
#define ELEMENTS 10
typedef int* arrayOfNPointers[N];
arrayOfNPointers myPtrs = { 0 };
int i;
for (i=0; i<N; i++) {
myPtrs[i] = malloc(sizeof( int ) * ELEMENTS);
}
您希望arrayOfPointer是一个指向ELEMENTS整数的N个指针的数组。另外,当malloc()为整数空间时,需要将ELEMENTS的数量乘以整数的大小。实际上,您分配的空间太小,无法容纳您尝试存储的数据。
你的typedef将arrayOfPointer声明为指向N个整数数组的指针。请记住使用左右阅读规则来了解您声明变量/类型的内容。因为你在parens中有(*arrayOfPointer)
,所以右边没有任何东西,左边有一个指针,所以arrayOfPointer是一个指针TO [N]
(右)int(左)。不是你想要的。
另外...... do not cast malloc() in C!
答案 2 :(得分:3)
根据malloc()
的使用情况,它似乎是int*
:
int* myPtrs[N]; /* Array of 'int*'. */
而不是指向int[128]
数组的指针:
int (*myPtrs)[N]; /* Pointer to array of int[N]. */
是必需的。 malloc()
的使用不正确,因为它为10个字节分配内存而不 10 int
s。改为:
/* Casting result of malloc() is not required. */
myPtrs[i] = malloc(sizeof(int) * ELEMENTS);