该程序的目的是使用指针将名称分配给相应的年龄。
#include <stdio.h>
#include <stdlib.h>
/* these arrays are just used to give the parameters to 'insert',
to create the 'people' array
*/
#define HOW_MANY 7
char *names[HOW_MANY]= {"Simon", "Suzie", "Alfred", "Chip", "John", "Tim",
"Harriet"};
int ages[HOW_MANY]= {22, 24, 106, 6, 18, 32, 24};
/* declare your struct for a person here */
typedef struct {
char *name;
int age;
} person;
static void insert(person *people[], char *name, int age, int *nextfreeplace)
{
/* creates memory for struct and points the array element to it. */
people[*nextfreeplace] = malloc(sizeof(person));
/* put name and age into the next free place in the array parameter here */
(*people[*nextfreeplace]).name = name;
(*people[*nextfreeplace]).age = age;
/* modify nextfreeplace here */
(*nextfreeplace)++;
}
int main(int argc, char **argv)
{
/* declare the people array here */
person *people[HOW_MANY];
int nextfreeplace = 0;
for (int i = 0; i < HOW_MANY; i++)
{
insert (&people, names[i], ages[i], &nextfreeplace);
}
/* print the people array here*/
for (int i = 0; i < HOW_MANY; i++) {
printf("Name: %s. Age: %d\n", (*people[i]).name, (*people[i]).age);
}
/* Releases the memory allocated by malloc */
for (int i = 0; i < HOW_MANY; i++) {
free(people[i]);
}
return 0;
}
它完美无缺,但是当我编译它时,我会收到两个警告。
arrays.c: In function ‘main’:
arrays.c:41:13: warning: passing argument 1 of ‘insert’ from incompatible pointer type [-Wincompatible-pointer-types]
insert (&people, names[i], ages[i], &nextfreeplace);
^
arrays.c:19:13: note: expected ‘person ** {aka struct <anonymous> **}’ but argument is of type ‘person * (*)[7] {aka struct <anonymous> * (*)[7]}’
static void insert(person *people[], char *name, int age, int *nextfreeplace)
我对指针和C一般是新手,想要一些帮助解释为什么我会得到这些警告以及如何摆脱它们。谢谢!
答案 0 :(得分:2)
使用people
代替&people
。
以下是警告信息所说的内容:
您的函数insert
需要类型为person **
的参数(指向person
的指针)。您的代码向它发送一个不同类型的参数:person * (*)[7]
,这是一种C方式,用于&#34;指向指向person
&#34;的7个指针数组的指针。
(您可以使用网站http://cdecl.org来发现:在其字段中输入struct person * (*people)[7]
,并将其翻译为英语)
如果将数组而不是指向它的指针发送到insert
函数,编译器会将名称people
视为指向{{1}的指针的指针}&#34;,在此上下文中是&#34;指向person
&#34;的指针数组的特例。这个过程被称为&#34;衰变&#34;数组到指针,并解释为here。
答案 1 :(得分:1)
你也可以这样做:
/* declare your struct for a person here */
typedef struct {
char *name;
int age;
} person, *people_t;
然后
static void insert(people_t people[], char *name, int age, int *nextfreeplace){...}
然后
people_t people[HOW_MANY];
int nextfreeplace = 0;
for (i = 0; i < HOW_MANY; i++){
insert (people, names[i], ages[i], &nextfreeplace);
}
编译器:Visual Studio 2010
答案 2 :(得分:1)
这实际上是一个警告,显示在两行(第41行警告的来源,以及第19行引起问题的声明)。
您可以通过从insert
的调用中删除&符来清除警告,因此
insert(people, names[i], ages[i], &nextfreeplace);
在C中,数组的名称与其地址同义。
另外,要清除警告中的<anonymous>
标记,typedef
结构时的常用习惯如下:
typedef struct <name>
{
...
} <name>;
在你的情况下将是:
typedef struct person {
char *name;
int age;
} person;
答案 3 :(得分:-1)
你得到这些警告是因为&#34;插入&#34;期望指向指针指向人,但只获得一个指针指向指针的指针。
在第41行,摆脱&#34;&amp;&#34;来自&#34;&amp; people&#34;,如:
insert(people,names [i],ages [i],&amp; nextfreeplace);