0

メイン関数で「nextfreeplace」を使用できるように、パラメーターを参照として作成したいと思います。問題は、パラメーターを参照として作成するという用語を本当に理解していないことです。誰でも助けてください。コンパイル警告も出ました。

#include <stdio.h>
#include <stdlib.h>


/* these arrays are just used to give the parameters to 'insert',
   to create the 'people' array */
char *names[7]= {"Simon", "Suzie", "Alfred", "Chip", "John", "Tim",
          "Harriet"};
int ages[7]= {22, 24, 106, 6, 18, 32, 24};


/* declare your struct for a person here */
typedef struct{
  char *names;
  int ages; 
}  person;

static void insert (person **p, char *s, int n, int *nextfreeplace) {

 *p = malloc(sizeof(person));

/*static int nextfreeplace = 0;*/

/* put name and age into the next free place in the array parameter here */
(*p)->names=s;
(*p)->ages=n;


  /*  make the parameter as reference*/  
   sscanf(nextfreeplace,"%d", *p);


  /* modify nextfreeplace here */
  (*nextfreeplace)++;

  }

int main(int argc, char **argv) {

  /* declare nextinsert */
   int *nextfreeplace = 0;


  /* declare the people array here */
   person *p[7];

   //insert the members and age into the unusage array. 
  for (int i=0; i < 7; i++) {
    insert (&p[i], names[i], ages[i], nextfreeplace);
    /* do not dereference the pointer */
  }

  /* print the people array here*/
  for (int i=0; i < 7; i++) {
    printf("The name is: %s, the age is:%i\n", p[i]->names, p[i]->ages);
  }


  /* This is the third loop for call free to release the memory allocated by malloc */
  /* the free()function deallocate the space pointed by ptr. */
  for(int i=0; i<7;i++){
    free(p[i]);
  }

}
4

3 に答える 3

2

は を引き起こす可能性のある(*nextfreeplace)++;アドレスにアクセスしようとするため、これを以下のコードに変更する必要があります。0x000000000segmentation fault

 int nextfreeplace = 0;


  /* declare the people array here */
   person *p[7];

   //insert the members and age into the unusage array. 
  for (int i=0; i < 7; i++) {
    insert (&p[i], names[i], ages[i], &nextfreeplace);
    /* do not dereference the pointer */
  }
于 2012-10-22T10:46:54.797 に答える
1

sscanf は文字列 (最初のパラメーター) を解析しますが、nextfreeplace は int へのポインターです。また、NULL ポインターとして挿入に渡されます。

于 2012-10-22T10:43:58.973 に答える
1

何かのコピーではなく、その何かの場所をパラメーターとして渡す場合の一般的な用語であるため、関数内で変更できます。

例 1:

int add(int x, int y)
{
  int s = x + y;
  x = 0; // this does not affect x in main()
  return s;
}

int main(void)
{
  int x = 1, y = 2, sum;
  sum = add(x, y);
  return 0;
}

例 2:

int add(int* x, int y)
{
  int s = *x + y;
  *x = 0; // this affects x in main()
  return s;
}

int main(void)
{
  int x = 1, y = 2, sum;
  sum = add(&x, y);
  return 0;
}

あなたのコードはあなたが望むものに近いです。2 つの例の違いに注意してください。コンパイラですべての警告を有効にして、それに従います。

于 2012-10-22T10:48:47.443 に答える