2012-11-14 37 views
1

im在ANSI C中编写程序,并且有一个函数,其中im传递指向信号量指针的指针struct sembuf semb[5]Ansi C - 函数期望指针指向数组

现在功能的头部看起来像:

void setOperations(struct sembuf * op[5], int nr, int oper) 

但即时得到警告:

safe.c:20: note: expected ‘struct sembuf **’ but argument is of type ‘struct sembuf (*)[5]’ 

如何解决这个问题?

编辑
通话:

setOperations(&semb, prawa, -1); 
+2

你的函数调用是什么样的? – dst2

+0

你需要两次指示灯的指示,而你没有。显示实际通话的代码 – SomeWittyUsername

+0

啊,我忘了:setOperations(&semb,prawa,-1); – marxin

回答

6

这是函数应该如何申报,如果你想要一个指针传递给数组,而不是指针数组:

void setOperations(struct sembuf (*op)[5], int nr, int oper); 
3

您当前的声明(struct sembuf * op[5])指5个指针数组以struct sembuf

无论如何,数组都是作为指针传递的,所以在头文件中你需要:struct sembuf op[5]。 无论如何将传递一个指向数组的指针。没有数组将被复制。 声明此参数的替代方法是struct sembuf *op,这是指向struct sembuf的指针。

+0

严。那么,如何为5个结构数组的指针声明头? – marxin

+0

指向5个结构数组的指针与C语言中指向该数组第一个元素的指针相同。没有额外的信息隐藏在C数组中,而不是第一个元素的地址,所以不需要显式指针。 –

+0

这不是我即时要求的:P我明白了,我可以传递一个指向第一个元素的指针,并且会很好。我现在也知道如何传递指向数组的指针(Vaughn Cato响应)。 Thx无论如何 – marxin

0

你也许在这个复杂...

如果您想要传递一个结构数组,它实际上和传递任何数组没有什么不同。一旦你的阵列,获得的地址很简单,让我给你一个简单的例子:

比方说,你有这样的结构:如果你想声明它静态地在你的main()可以

typedef struct s { 
    int a; 
    int b; 
} mys; 

更多信息:

int main(int argc, char *argv[]) 
{ 
    mys local[3]; 
    memset(local, 0, sizeof(mys)*3); // Now we have an array of structs, values are 
             // initialized to zero. 

    // as a sanity check let's print the address of our array: 
    printf("my array is at address: %#x\n", local); 

    changeit(local, 3); // now we'll pass the array to our function to change it 

现在我们可以有我们的函数,它接受阵列并更改值:

void changeit(mys remote[], int size) 
{ 
    int count; 
    printf("my remote array is at address: %#x\n", remote); //sanity check 
    for(count = 0; count < size; count++) { 
     remote[count].a = count; 
     remote[count].b = count + size; 
    } 
} 

一旦返回,我们可以从main()与其他一些环一样打印值:

for(int count = 0; count < 3; count ++) 
    printf("struct[%d].a = %d\n struct[%d].b = %d\n", 
      count, local[count].a, count, local[count].b); 

而且我们会得到一些输出,看起来像:

>> ./a.out 
    my array is at address: 0xbf913ac4 
    my remote array is at address: 0xbf913ac4 
    struct[0].a = 0 
    struct[0].b = 3 
    struct[1].a = 1 
    struct[1].b = 4 
    struct[2].a = 2 
    struct[2].b = 5 

所以你可以看到它是相同的数组(相同的地址),这就是你如何获得结构数组到另一个函数。它清楚了吗?

+0

我知道Mike。谢谢。 Vaughn Cato很好地回答了我的问题。我正在传递指针数组,而不是指向数组的指针。那是所有:)但thx;) – marxin

+0

@ user1040813 - 酷,很高兴你得到它! – Mike

+0

@ user1040813 - 不知道为什么你需要传递一个指向数组的指针? – Mike