因此我有一个名为“ library”的结构,该结构存储了“ books”结构的对象,并通过3本书的列表进行了初始化,但是当我尝试打印该对象的属性时,我遇到了“分段错误(堆放内核) “ 错误。我知道这意味着我正在尝试访问一些我无权访问的内存,但是在这种情况下,我可以正确访问第一个元素,因此这使我相信我初始化不正确。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXBOOKS 10
typedef struct books
{
char* title;
char* author;
int id;
}book;
typedef struct library
{
int number_of_books;
book* booklist [MAXBOOKS];
}lib;
void storeBook(lib library,book CurrentBook)
{
library.booklist[0] = &CurrentBook;
}
void printLibrary(lib library)
{
for(int i = 0; i < library.number_of_books; i++)
{
printf("Author:%s\n",library.booklist[i]->title);
}
}
int main()
{
book b_1 = {"The trial","Kafka",101};
book b_2 = {"The lurking fear","Lovecraft",102};
book b_3 = {"Dora's storytime collection","Valdes",103};
book* list = (book*)malloc(3*sizeof(book));
list[0] = b_1; list[1] = b_2; list[2] = b_3;
lib CurrentLibrary = {3,{list}};
printLibrary(CurrentLibrary);
return 0;
}
booklist1[i] = *(booklist1+i)
,那么booklist2[i][j] = *(*(booklist2+i)+j)
,如果j=0
,那么*(*(booklist2+i)+j) = *(*(booklist2+i)+0) = *(booklist2[i]) = *booklist2[i]
booklist2[0]
指向第一行,booklist2[1]
指向第二行,依此类推,等等。
你正在定义一个书本指针数组(2D数组):book* booklist [MAXBOOKS]
但是list
是一个书本数组(1-D数组)。执行此语句后,lib CurrentLibrary = {3,{list}};
list
数组将存储到booklist[0]
行中。但是的所有其他指针booklist[1], booklist[2],..... booklist[9]
都没有指向任何元素。但是,你正在访问booklist[1]
,booklist[2]
以及booklist[3]
在printLibrary
功能。这是分段故障的原因。
有关更多信息(针对二维阵列),请打印以下行:
printf("Title %s\n", library.booklist[0][0].title);
版画->标题审判
printf("Title %s\n", library.booklist[0][1].title);
版画->标题潜伏的恐惧
printf("Title %s\n", library.booklist[0][2].title);
版画->标题多拉的故事集
但是尝试访问library.booklist[1][0].title
将引发分段错误,因为第二行指针未指向任何元素。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXBOOKS 10
typedef struct books
{
char* title;
char* author;
int id;
}book;
typedef struct library
{
int number_of_books;
book *booklist; // It should be 1-D array, since you are passing 1-D array of book
}lib;
void storeBook(lib library,book CurrentBook)
{
library.booklist[0] = CurrentBook;
}
void printLibrary(lib library)
{
for(int i = 0; i < library.number_of_books; i++)
{
printf("Title:%s\n",library.booklist[i].title);
printf("Author:%s\n",library.booklist[i].author);
printf("Book ID:%d\n",library.booklist[i].id);
}
}
int main()
{
book b_1 = {"The trial","Kafka",101};
book b_2 = {"The lurking fear","Lovecraft",102};
book b_3 = {"Dora's storytime collection","Valdes",103};
book* list = malloc(3*sizeof(book));
list[0] = b_1; list[1] = b_2; list[2] = b_3;
lib CurrentLibrary = {3,list}; // list is 1-D array of book
printLibrary(CurrentLibrary);
return 0;
}
输出 :
Title:The trial
Author:Kafka
Book ID:101
Title:The lurking fear
Author:Lovecraft
Book ID:102
Title:Dora's storytime collection
Author:Valdes
Book ID:103
太感谢了。但是,为什么{book * booklist [MAXBOOKS];}定义2D数组?
book* booklist [MAXBOOKS]
是10个指针的数组。查找有关指针数组的信息。阅读本文:google.com/amp/s/www.geeksforgeeks.org/…
我看不到您对2D array的断言,因为它是指向书本的指针的数组...您可以存储一个数组或一本书,但是没有2D数组。
@LuisColorado
book* booklist [MAXBOOKS];
是指针数组。请检查我的编辑内容,以清楚了解。