我想将参数作为参考,以便在主函数中使用“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]);
}
}
答案 0 :(得分:2)
这应该更改为以下代码,因为(*nextfreeplace)++;
将尝试访问可能导致0x000000000
的{{1}}地址。
segmentation fault
答案 1 :(得分:1)
sscanf解析一个字符串(它的第一个参数),但nextfreeplace是一个指向int的指针。它也被传递给作为NULL指针插入。
答案 2 :(得分: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;
}
您的代码接近您想要的。请注意两个示例之间的差异。启用编译器中的所有警告并遵循它们。