Ansi C-函数需要指向数组的指针

Ansi C-函数需要指向数组的指针,c,arrays,pointers,ansi,C,Arrays,Pointers,Ansi,im用ANSIC编写程序,并且有一个函数,其中im将指针传递给信号量数组struct sembuf semb[5] 现在,该函数的标题如下所示: void setOperations(struct sembuf * op[5], int nr, int oper) >> ./a.out my array is at address: 0xbf913ac4 my remote array is at address: 0xbf913ac4 struct[0].a =

im用ANSIC编写程序,并且有一个函数,其中im将指针传递给信号量数组struct sembuf semb[5]

现在,该函数的标题如下所示:

void setOperations(struct sembuf * op[5], int nr, int oper)
>> ./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
但我得到了警告:

safe.c:20: note: expected ‘struct sembuf **’ but argument is of type ‘struct sembuf (*)[5]’
如何解决这个问题

编辑 电话:

您当前的声明struct sembuf*op[5]表示指向struct sembuf的5个指针数组

数组无论如何都是作为指针传递的,因此在标头中需要:struct sembuf op[5]。 无论如何都将传递指向数组的指针。不会复制任何数组。 声明此参数的另一种方法是struct sembuf*op,它是指向struct sembuf的指针。

您当前的声明struct sembuf*op[5]表示指向struct sembuf的5个指针数组

数组无论如何都是作为指针传递的,因此在标头中需要:struct sembuf op[5]。 无论如何都将传递指向数组的指针。不会复制任何数组。
声明此参数的另一种方法是struct sembuf*op,它是指向struct sembuf的指针。

如果要将指针传递给数组而不是指针数组,则应这样声明函数:

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

如果要将指针传递给数组而不是指针数组,则应这样声明函数:

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

你可能把事情复杂化了

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

假设您有这个结构:

typedef struct s {
    int a;
    int b;
} mys;
如果您想在main中静态声明它,可以执行以下操作:

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;
    }
}
我们将得到如下输出:

void setOperations(struct sembuf * op[5], int nr, int oper)
>> ./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

因此,您可以看到它是相同的数组,相同的地址,这就是如何将结构数组传递给另一个函数的方法。这清楚了吗?

你可能把事情复杂化了

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

假设您有这个结构:

typedef struct s {
    int a;
    int b;
} mys;
如果您想在main中静态声明它,可以执行以下操作:

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;
    }
}
我们将得到如下输出:

void setOperations(struct sembuf * op[5], int nr, int oper)
>> ./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


因此,您可以看到它是相同的数组,相同的地址,这就是如何将结构数组传递给另一个函数的方法。这清楚了吗?

您的函数调用是什么样子的?您应该解除指针的安全性两次,而不是。显示实际callAh的代码,我忘了:setOperations&semb,prawa,-1;你的函数调用是什么样子的?你需要两次解除指针的安全性,但你没有。显示实际callAh的代码,我忘了:setOperations&semb,prawa,-1;嗯。那么,如何为指向5个结构数组的指针声明头呢?指向5个结构数组的指针与指向该数组的第一个元素的指针在C术语中是相同的。C数组中除了第一个元素的地址之外,没有其他隐藏的信息,所以不需要显式的指针。这不是我真正想问的:P我明白了,我可以传递一个指向第一个元素的指针,这很好。我现在还知道如何将指针传递给数组Vaughn Cato response。Thx无论如何是的,这是可能的,但若数组第一次在堆栈上声明,你们不应该改变它的起始位置,因为若你们这样做,你们可能会得到严重的内存泄漏。我不会改变它,我只是想知道地址。我想我需要,因为我正在从多个进程读取数组。那么,如何为指向5个结构数组的指针声明头呢?指向5个结构数组的指针与指向该数组的第一个元素的指针在C术语中是相同的。C数组中除了第一个元素的地址之外,没有其他隐藏的信息,所以不需要显式的指针。这不是我真正想问的:P我明白了,我可以传递一个指向第一个元素的指针,这很好。我现在还知道如何将指针传递给数组Vaughn Cato response。Thx无论如何是的,这是可能的,但若数组第一次在堆栈上声明,你们不应该改变它的起始位置,因为若你们这样做,你们可能会得到严重的内存泄漏。我不会改变它,我只是想知道地址。我想我需要,因为我正在从多个进程读取数组。我认识迈克。谢谢沃恩·卡托很好地回答了我的问题。我传递的是指针数组,而不是指向数组的指针。仅此而已:但thx@user1040813-酷,很高兴你得到了它@user1040813-我想知道,为什么你需要传递一个指向数组的指针?@user1040813-因为数组无论如何都会变成指针。因此,传递指向它们的指针只会混淆代码。它们可以通过引用访问,只需传递数组,您不需要在正在使用的函数中尊重它们,并且您可以获得数组的地址
没有指针。那么,将指针传递给数组到底能给你带来什么呢?我知道数组实际上是指向第一个元素的指针。我知道。但这只是一个学习的例子。当将来我需要指向数组的指针时,我会知道如何做,例如在其他函数中指向malloc内存。谢谢沃恩·卡托很好地回答了我的问题。我传递的是指针数组,而不是指向数组的指针。仅此而已:但thx@user1040813-酷,很高兴你得到了它@user1040813-我想知道,为什么你需要传递一个指向数组的指针?@user1040813-因为数组无论如何都会变成指针。因此,传递指向它们的指针只会混淆代码。它们可以通过引用访问,只需传递数组,您不需要在正在使用的函数中尊重它们,并且您可以在不使用指针的情况下获取数组的地址。那么,将指针传递给数组到底能给你带来什么呢?我知道数组实际上是指向第一个元素的指针。我知道。但这只是一个学习的例子。当将来我需要指向数组的指针时,我将知道如何做,例如在其他函数中指向malloc内存。