此代码与我尝试的内容类似,但是我收到的错误是说我传递了不兼容的类型
#include <stdio.h>
struct numbers{
int num;
};
void fillArray(struct numbers* a[]);
int main(void)
{
struct numbers array[4];
fillArray(&array);
for(int i = 0; i < 4; i++)
{
printf("%d", array[i].num);
}
}
void fillArray(struct numbers* a[])
{
for(int i = 0; i < 4; i++)
{
a[i]->num = i;
}
}
答案 0 :(得分:2)
功能参数
void fillArray(struct numbers* a[]);
调整为
void fillArray(struct numbers ** a);
另一方面,此调用中的参数类型
fillArray(&array);
是struct numbers( * )[4]
。 struct numbers **
和struct numbers ( * )[4]
类型不兼容。
没有必要传递指向数组的指针,因为如果只传递隐式转换为指向第一个元素的指针的数组,则数组的元素已经间接传递。
所以你需要的是声明和定义像
这样的函数void fillArray( struct numbers a[] )
// or
// void fillArray( struct numbers *a )
{
for(int i = 0; i < 4; i++)
{
a[i].num = i;
}
}
并将其称为
fillArray( array );
考虑到函数取决于幻数4.最好定义函数,以便它可以处理各种元素的数组。
所以我会定义像
这样的函数void fillArray( struct numbers a[], size_t n )
// or
// void fillArray( struct numbers *a, size_t n )
{
for ( size_t i = 0; i < n; i++ )
{
a[i].num = i;
}
}
并将其称为
fillArray( array, 4 );
这里演示了程序如何整体看待
#include <stdio.h>
struct numbers
{
int num;
};
void fillArray( struct numbers a[], size_t n )
{
for ( size_t i = 0; i < n; i++ )
{
a[i].num = i;
}
}
#define N 4
int main(void)
{
struct numbers array[N];
fillArray( array, N );
for ( size_t i = 0; i < N; i++ )
{
printf( "%d ", array[i].num );
}
putchar( '\n' );
return 0;
}
它的输出是
0 1 2 3
要使用具有不同数量元素的数组,只需更改宏名称N
的值即可。因此,程序及其功能不依赖于幻数4
。
答案 1 :(得分:1)
你的函数想要一个指针数组,但你有一个数组,所以
void fillArray(struct numbers* a);
或
void fillArray(struct numbers a[]);
此外,使用[i]您已取消引用指针,因此您需要.
而不是->
运算符。
#include <stdio.h>
struct numbers
{
int num;
};
void fillArray(struct numbers *a);
int main(void)
{
struct numbers array[4];
fillArray(array);
for (int i = 0; i < 4; i++)
{
printf("%d", array[i].num);
}
printf("\n");
}
void fillArray(struct numbers *a)
{
for (int i = 0; i < 4; i++)
{
a[i].num = i;
}
}
最后使用c array decays to pointer到数组的第一项,所以
fillArray(&array);
必须是
fillArray(array);
或
fillArray(&array[0]);
最后,您应该将数组大小传递给您的函数,而不是使用固定数字。你可以使用指针和大小
来做到这一点#include <stdio.h>
struct numbers
{
int num;
};
void fillArray(size_t size, struct numbers *a);
int main(void)
{
struct numbers array[4];
fillArray(sizeof(array)/sizeof(array[0]), array);
for (int i = 0; i < 4; i++)
{
printf("%d", array[i].num);
}
printf("\n");
}
void fillArray(size_t size, struct numbers *a)
{
for (size_t i = 0; i < size; i++)
{
a[i].num = i;
}
}
或使用VLA s
#include <stdio.h>
struct numbers
{
int num;
};
void fillArray(size_t size, struct numbers a[size]);
int main(void)
{
struct numbers array[4];
fillArray(sizeof(array)/sizeof(array[0]), array);
for (int i = 0; i < 4; i++)
{
printf("%d", array[i].num);
}
printf("\n");
}
void fillArray(size_t size, struct numbers a[size])
{
for (size_t i = 0; i < size; i++)
{
a[i].num = i;
}
}
答案 2 :(得分:1)
你可能想要这个:
#include <stdio.h>
struct numbers {
int num;
};
void fillArray(struct numbers a[]);
int main(void)
{
struct numbers array[4];
fillArray(array);
for (int i = 0; i < 4; i++)
{
printf("%d\n", array[i].num);
}
}
void fillArray(struct numbers a[])
{
for (int i = 0; i < 4; i++)
{
a[i].num = i;
}
}
答案 3 :(得分:-1)
仅提及数组名称就足够了。编译器会将其转换为指向第一个元素的指针。
所以而不是
fillArray(&array);
你写了
fillArray(array);
虽然这回答了你的问题,但当然被调用的函数必须有一个兼容的定义,在你的情况下不是这样。