我是C的新手,所以这可能是个愚蠢的问题:
我想在这里做的是将数据输入到指向结构的指针数组中,然后打印出来。但是我在运行insert函数时遇到了分段错误。
下面是我的代码
普通.h

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

typedef struct book * Book;

struct book{
    int id;
    char *name;
};

extern int b_insert(Book *b, int id, char *name);
extern int b_print(Book books[], int len);

插入.c
#include "common.h"

int b_insert(Book *b, int id, char *name){
    Book p;
    p = (Book)malloc(sizeof(struct book));
    p->id = id;
    strcpy(p->name, name);

    *b = p;
    printf("success insert book:\n");
    printf("\tID: %d Name: %s\n", (*b)->id, (*b)->name);

    return 0;

}


int b_print(Book books[], int len){
    int i;
    printf("Book List\n");
    for(i=0; i<len; i++){
        printf("books[%d] = ID: %d, Name: %s\n", i, books[i]->id, books[i]->name);
    }
    return 0;

}

主c
#include "common.h"
#define MAX 2

int main(){
    Book books[MAX];
    Book *b=books;
    int i;
    int id;
    char name[10];




    for(i=0; i<MAX; i++){
        printf("please input new books info\n");
        printf("ID: ");
        scanf("%d", &id);
        printf("Name: ");
        scanf("%s", name);
        if(b_insert(b, id, name) == -1){
            printf("fail to insert\n");
        }
        b++;
    }

    b_print(books, MAX);

    return 0;
}

最佳答案

主要问题:
使用前为p->name分配内存

strcpy(p->name, name);

使用malloc
p->name = malloc(10); //Or some other size

其他问题:
移除此处的石膏:
p = (Book)malloc(sizeof(struct book));

为什么?Here is the answer
if(b_insert(b, id, name) == -1){永远不会是真的。
检查malloc的结果以检查它是否成功分配内存。
检查所有scanfs的返回值,看它是否扫描数据成功。
在第二个scanf中添加长度修饰符以防止缓冲区溢出:
scanf("%9s", name); /* +1 for the NUL-terminator */

关于c - 使用malloc的段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31264927/

10-12 16:05