在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);
答案 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
所以你可以看到它是相同的数组(相同的地址),这就是你如何获得结构数组到另一个函数。那清楚了吗?