2013-04-23 64 views
3

我在访问传递给函数的数组的元素时遇到了一些问题。访问类型为def的指针数组的元素

#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

在第二个例子中,'pIn'和'pOut'是什么类型? – 2013-04-23 21:03:22

回答

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为N指针数组元素的整数。另外,当你的malloc()为你的整数空间时,你需要将ELEMENTS数乘以整数的大小。实际上,您分配的空间太小,无法保存要存储在其中的数据。

您的typedef将arrayOfPointer声明为一个N个整数数组的指针。请记住使用左右读取规则来理解您声明变量/类型的内容。因为你有param中的(*arrayOfPointer),所以右边没有东西,并且有一个指向左边的指针,所以arrayOfPointer是一个指向[N](right)int(left)的指针。不是你想要的。

另外... do not cast malloc() in C

5
typedef int (*arrayOfNPointers)[N]; 

So, if this is right, it is a data type describing an array of N pointers to int.

我认为这是一个指向N个整数的数组,并不为N指针整数数组....

这意味着下面的行不表现因为你的期望... myPtrs [i] =(int *)malloc(ELEMENTS); 因为myPtrs是一个指向N维数组的指针(在本例中是一个128个整数的数组),myPtrs [i]是第i个n维数组。所以,你想分配一个指向数组的指针,这就是为什么你得到的味精...

error: incompatible types when assigning to type 'int[128]' from type 'int *'

+1

是的,一个N指针指向int数组的实际typedef只是'typedef int * arrayOfNPointers [N];' – Medinoc 2013-04-23 21:07:53

+0

请注意,malloc()也是错误的..他将ELEMENTS传递给malloc,而不用乘以整数的大小。另外,他不应该在C应用程序中投射malloc()。 – 2013-04-23 21:16:07

+0

@Scott我没有发现,这是另一个好点 – Jimbo 2013-04-24 08:40:01

3

基于使用的malloc()似乎的int*数组:

int* myPtrs[N]; /* Array of 'int*'. */ 

和不是指向int[128]阵列的指针:

int (*myPtrs)[N]; /* Pointer to array of int[N]. */ 

是必需的。使用malloc()是不正确的,因为它分配10个字节的内存,而不是 s。更改为:

/* Casting result of malloc() is not required. */ 
myPtrs[i] = malloc(sizeof(int) * ELEMENTS);