2012-10-22 142 views
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]); 
    } 

} 

回答

1

sscanf解析一个字符串(它的第一个参数),但nextfreeplace是一个指向int的指针。它也被传递为插入为NULL指针。

2

这应该更改为下面的代码,因为(*nextfreeplace)++;将尝试访问地址0x000000000,这可能会导致segmentation 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 */ 
    } 
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; 
} 

你的代码是接近你想要什么。请注意两个示例之间的差异。在您的编译器中启用所有警告并按照它们执行。