2017-04-14 255 views
0

指针和数组我真的很不愉快,我真的需要帮助。C指针结构数组指针

有是有这个结构的练习:

typedef struct student_node{ 
    unsigned number; 
    const char *name; 
    unsigned class; 
    struct student_node *next; 
} StudentNode; 

,我要实现这个功能:

void groupStudentByClass(StudentNode *classes[], StudentNode students[], size_t num_students) 

我的问题是,我想改变的东西像类和打印数量价值,我不能。它给了我“分段错误(核心转储)”。但我不明白为什么...

这是测试代码:

size_t nClasses=3; 
StudentNode *classes [nClasses]; 
classes[0]->number=0; 
printf("%u\n",classes[0]->number); 

顺便说一句,我不能使用malloc和东西分配内存。

+0

在stackoverflow.com上,当询问有关运行时问题的问题时(因为此问题正在执行),有一定的要求。发布实际输入,发布实际输出,发布预期输出,发布简短,完整,干净地编译仍然存在问题的代码。在这种情况下,发布代码的要求未得到满足。关于代码没有得到满足的要求使得这个问题脱离了主题。 – user3629249

回答

0

@Matthias已经解释了为什么你所得到的SEGV这样做什么。

如果你不能使用malloc,那么你需要预先分配结构。像

const size_t MAX_STUDENT = 1024; 
StudentNode studentPool[MAX_STUDENT]; 
int studentLast = -1; 

东西然后你需要日常

StudentNode* StudentGet() 
{ 
    if (++studentLast >= MAX_STUDENT) 
    { 
     /* Print error message and exit */ 
    } 
    return studentPool[studentLast]; 
} 

接下来的分配,当你需要分配

classes[0] = StudentGet(); 

然后,你可以做你的作业和打印。

您可能还需要编写例程以释放结构并将其返回到池中。

+0

谢谢。随着你的回答,我想我知道我必须做什么。我有一个指向nClasses结构体的指针数组。因为它们都是指针,而且它们只在只读部分。所以我必须用下一个指针指向学生。这部分在我的大脑中仍然没有好好燃烧,但我想我已经得到了它。再一次感谢你:) –

0
StudentNode *classes [nClasses]; 

仅创建3个指针。但他们没有指向任何东西。 因此

classes[0] 

在内存中不存在。

我想,你应该使用你的函数参数得到的指针。

+0

谢谢。随着你的回答,我想我知道我必须做什么。我有一个指向nClasses结构体的指针数组。因为它们都是指针,而且它们只在只读部分。所以我必须用下一个指针指向学生。这部分在我的大脑中仍然没有好好燃烧,但我想我已经得到了它。再一次感谢你:) –

0

这条线:

StudentNode *classes [nClasses]; 

分配一个3个指针的数组,但这些指针是NULL充其量(更糟的是,它们可以含有任意的垃圾)。即使你不能使用malloc(我想这是作业的一部分),你可以把你的student_node结构栈上,像这样:

StudentNode s0 = { 
    .number = 0, 
    .name = "Alice", 
    .class = 0, 
}; 

StudentNode s1 = { 
    .number = 1, 
    .name = "Bob", 
    .class = 0, 
}; 

StudentNode s2 = { 
    .number = 2, 
    .name = "Peter", 
    .class = 0, 
}; 

然后把它们连在一起:

s0.next = &s1; 
s1.next = &s2; 
// leave s2.next NULL 

然后,最后,您可以指定在链classes[0]第一个学生:

classes[0] = &s0; 
+0

谢谢。随着你的回答,我想我知道我必须做什么。我有一个指向nClasses结构体的指针数组。因为它们都是指针,而且它们只在只读部分。所以我必须用下一个指针指向学生。这部分在我的大脑中仍然没有好好燃烧,但我想我已经得到了它。再次感谢你:) –

0

我觉得你不需要一个指向类的指针。你真的想在您的测试代码,这样做会

size_t nClasses=3; 
StudentNode classes [nClasses]; 
classes[0].number=0; 
printf("%u\n",classes[0].number); 

此外,由于你不能使用malloc我建议的认定中

typedef struct student_node{ 
    unsigned number; 
    const char name[100]; // or whatever max name size you want 
    unsigned class; 
    struct student_node *next; 
} StudentNode; 
+0

谢谢。随着你的回答,我想我知道我必须做什么。我有一个指向nClasses结构体的指针数组。因为它们都是指针,而且它们只在只读部分。所以我必须用下一个指针指向学生。这部分在我的大脑中仍然没有好好燃烧,但我想我已经得到了它。再次感谢你:) –