C 当我将指针设置为NULL时,我的程序崩溃

C 当我将指针设置为NULL时,我的程序崩溃,c,pointers,struct,null,crash,C,Pointers,Struct,Null,Crash,这让我发疯,我已经做了家庭作业,但出于某种原因 for (int i = 0; i < room->num_of_challenges; i++) { // need a check if (strcmp(room_to_enter, room->challenges[i].challenge->name) == 0) { room->challenges[i].start_time = start_time;

这让我发疯,我已经做了家庭作业,但出于某种原因

for (int i = 0; i < room->num_of_challenges; i++) { // need a check
        if (strcmp(room_to_enter, room->challenges[i].challenge->name) == 0) {
            room->challenges[i].start_time = start_time;
            room->challenges[i].visitor = malloc(sizeof(room->challenges[i].visitor));
            room->challenges[i].visitor->current_challenge = malloc(sizeof(room->challenges[i].visitor->current_challenge));
            *room->challenges[i].visitor->current_challenge = room->challenges[i];
            *room->challenges[i].visitor->room_name = NULL;
            *room->challenges[i].visitor->room_name = malloc(strlen(room_to_enter)+1);
            strcpy(*room->challenges[i].visitor->room_name, room_to_enter);
            inc_num_visits(room->challenges[i].challenge);
        }
    }
这是一个3页的代码,每一页都有标题,每一页大约有300行,所以我不能全部发布,下面是结构:

struct SChallengeActivity;
typedef struct SVisitor
{
  char *visitor_name;
  int visitor_id;
  char **room_name;
  struct SChallengeActivity *current_challenge;
} Visitor;


typedef struct SChallengeActivity
{
   Challenge *challenge;
   Visitor *visitor;
   int start_time;
} ChallengeActivity;


typedef struct SChallengeRoom
{
   char *name;
   int num_of_challenges;
   ChallengeActivity *challenges;
} ChallengeRoom;
我们不能编辑这个结构,因为它是由家庭作业给出的,就像这样,问题是我试图将这一行设置为NULL,如下所示:

 *room->challenges[i].visitor->room_name = NULL;
它仍然在该行崩溃,由于某种原因,它无法到达结构中的该字段。 注意:忽略编码,我知道我应该在每一行之后检查malloc,但现在我想让它工作,为了让它工作我已经熬夜了,我不能,有什么帮助吗?
谢谢

为访问者分配内存时,您只分配指针的大小。挑战中的访问者字段只是指向访问者的指针。因此,您没有分配足够的内存。你应使用:

malloc(sizeof(Visitor))
获取访客结构的真实大小并分配足够的空间


此外,在分配之前将指针设置为null也是无用的。调用malloc()将覆盖它们。

为访问者分配内存时,只分配指针的大小。挑战中的访问者字段只是指向访问者的指针。因此,您没有分配足够的内存。你应使用:

malloc(sizeof(Visitor))
获取访客结构的真实大小并分配足够的空间

此外,在分配之前将指针设置为null也是无用的。对malloc()的调用将覆盖它们。

此外

*room->challenges[i].visitor->room_name = NULL;
room_name是一个char**(指向指针的指针),这意味着它仍然是一个指针,您可以在设置它之前取消对它的引用

不确定为什么它需要是指向指针的指针,但如果需要,则首先必须为一个或多个指针(例如数组)分配内存:

而且

room_name是一个char**(指向指针的指针),这意味着它仍然是一个指针,您可以在设置它之前取消对它的引用

不确定为什么它需要是指向指针的指针,但如果需要,则首先必须为一个或多个指针(例如数组)分配内存:


好吧,“房间”不好,“我”不好或“访客”不好。调试器说什么?room->challenges[i].visitor=malloc(sizeof(room->challenges[i].visitor));这看起来不对。您可能分配的是指针的大小,而不是结构。好吧,“room”不好,“i”不好或“visitor”不好。调试器说什么?room->challenges[i].visitor=malloc(sizeof(room->challenges[i].visitor));这看起来不对。您可能正在分配指针的大小,而不是结构。乐意帮助:)乐意帮助:)
room->challenges[i].visitor->room_name = malloc(sizeof(char*)*1);
*room->challenges[i].visitor->room_name = malloc(strlen(room_to_enter)+1);
...