Ansi C - 期望指向数组的函数

时间:2012-11-14 12:50:36

标签: c arrays pointers ansi

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

现在该函数的标题如下:

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);

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

你可能过于复杂了......

如果你想传递一个结构数组,它与传递任何数组的结果没什么不同。获得数组后,获取地址很简单,让我举个简单的例子:

假设你有这个结构:

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;
    }
}

一旦返回,我们就可以打印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

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