Warm tip: This article is reproduced from serverfault.com, please click

c-除第一个元素外的所有元素均存在分段错误

(c - Segmentation fault for all elements except the first)

发布于 2020-11-29 12:01:05

因此我有一个名为“ 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;
}
Questioner
Michael Bohanan
Viewed
11
Krishna Kanth Yenumula 2020-11-30 22:17:25

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