C程序:使用指针需要帮助

时间:2015-11-09 23:47:23

标签: c

该程序的目的是使用指针将名称分配给相应的年龄。

#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一般是新手,想要一些帮助解释为什么我会得到这些警告以及如何摆脱它们。谢谢!

4 个答案:

答案 0 :(得分:2)

TL; DR

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