2015-04-02 49 views
0

在我的代码中,有两个结构。一个叫人,一个叫person_list,通过引用来保存人物结构或“人”的列表。为包含指向不同结构的指针数组的结构填充数据

我想在person_list中填写(或引用)10个人结构,但是在运行此代码时,我遇到了分段错误。我如何处理或申报每个人的记忆,这样才能奏效?

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

#define MAX_LENGTH 50 
#define MAX_PEOPLE_ALLOWED 10 

struct person_list { 
    struct person *people[MAX_PEOPLE_ALLOWED]; 
}; 

struct person 
{ 
    char name[MAX_LENGTH]; 
    //int age; 
}; 

int main(int argc, char *argv) 
{ 
    struct person_list list; 
    struct person pers[10]; 
    int i; 
    char name[MAX_LENGTH]; 

    for (i = 0; i < MAX_PEOPLE_ALLOWED; i++) { 
     sprintf(descrip, "I am person number: %d", i); 
     strcpy(&pers[i].name, name); 
     list.people[i] = &pers[i]; 
    } 
} 
+0

要解决你的首要问题什么的,您可能需要删除'* '或者你需要为每个'struct person'分配空间。就目前而言,您正在写入未初始化的指针,并且当您这样做时崩溃是常见的结果(行为未定义,任何事情都会发生,但崩溃很可能)。 – 2015-04-02 02:11:16

+0

@JonathanLeffler我必须把:list.people [i] = malloc(sizeof(person)+ 1)?在数组中? – BDillan 2015-04-02 02:28:37

+0

不需要+1,但是,您需要为阵列中的每个条目分配类似的内存。你还需要清理'list.people [i] =&pers [i];'作业;它应该是一个结构赋值'* list.people [i] = pers [i];',然后你可以辩论你是否需要'pers'作为一个数组,如果它仍然是一个数组,应该是MAX_PEOPLE_ALLOWED而不是仅仅是10. – 2015-04-02 02:29:28

回答

0

@BDillan,我已经取得了一些简单的修正你的代码,希望您正在寻找类似这样

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

#define MAX_LENGTH 50 
#define MAX_PEOPLE_ALLOWED 10 

struct person_list { 
struct person *people[MAX_PEOPLE_ALLOWED]; 
}; 

struct person 
{ 
char name[MAX_LENGTH]; 
//int age; 
}; 

int main() 
{ 

struct person_list list; 
struct person pers[10]; 
char descrip[MAX_LENGTH]; 
int i; 
char name[MAX_LENGTH]; 

for (i = 0;i < MAX_PEOPLE_ALLOWED; i++) 
{ 
    sprintf(descrip, "I am person number: %d", i); 
    strcpy(pers[i].name,descrip); 
//puts(pers[i].name); 
    list.people[i] = &pers[i]; 
} 

//to display the details of persions entered above 

for (i = 0;i < MAX_PEOPLE_ALLOWED; i++) 
      printf("%s \n",list.people[i]->name); 

}