访问动态分配的struct成员时的"Segmentation fault"

Geo*_* R. 2 c struct heap-memory

我已经开始研究一个实现名为"PhoneBook"的结构的程序,该结构有两个成员:"length"和"allocatedSpace",两者都是"unsigned int"类型.结构是动态分配的.结构的两个成员在一个名为"InitializePhoneBook"的外部函数中分配.现在,当我尝试在"main"函数内打印结构的两个成员的值时,我得到"分段错误"错误.

PhoneBook.h

#ifndef PHONEBOOK_H
#define PHONEBOOK_H

struct PhoneBook
{   
    unsigned int length;
    unsigned int allocatedSpace;
};

void InitializePhoneBook(struct PhoneBook *phoneBook);
void ClearPhoneBook(struct PhoneBook *phoneBook);

#endif
Run Code Online (Sandbox Code Playgroud)

PhoneBook.c

#include <stdlib.h>

#include "PhoneBook.h"

void InitializePhoneBook(struct PhoneBook *phoneBook)
{
    phoneBook = malloc(sizeof(struct PhoneBook) * 1);

    phoneBook->length = 0;
    phoneBook->allocatedSpace = 1000;
}

void ClearPhoneBook(struct PhoneBook *phoneBook)
{
    free(phoneBook);
}
Run Code Online (Sandbox Code Playgroud)

main.c中

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

#include "PhoneBook.h"

int main(void)
{
    struct PhoneBook *phoneBook;

    InitializePhoneBook(phoneBook);

    printf("%d %d\n", phoneBook->length, phoneBook->allocatedSpace);

    ClearPhoneBook(phoneBook);

    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

用"gdb"运行"./a.out"我得到:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400621 in main () at ./main.c:12
12      printf("%u %u\n", phoneBook->length, phoneBook->allocatedSpace);
Run Code Online (Sandbox Code Playgroud)

P.P*_*.P. 7

当你这样做mallocInitializePhoneBook():

phoneBook = malloc(sizeof(struct PhoneBook) * 1);
Run Code Online (Sandbox Code Playgroud)

它不会修改指针,main因为您指定的指针是本地函数.将指针传递给指针或重写函数返回malloced指针.

void InitializePhoneBook(struct PhoneBook **phoneBook)
{
    *phoneBook = malloc(sizeof(struct PhoneBook) * 1);

    (*phoneBook)->length = 0;
    (*phoneBook)->allocatedSpace = 1000;
}
Run Code Online (Sandbox Code Playgroud)

打电话main():

InitializePhoneBook(&phoneBook);
Run Code Online (Sandbox Code Playgroud)

并改变原型:

void InitializePhoneBook(struct PhoneBook **phoneBook);
Run Code Online (Sandbox Code Playgroud)

我注意到的其他问题:

  • 您还应该检查malloc失败的结果.
  • 使用%u格式说明符打印unsigned ints.