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)
当你这样做malloc时InitializePhoneBook():
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.