使用malloc进行分段错误

时间:2015-07-07 09:35:24

标签: c malloc

我是C的新手,所以这可能是个愚蠢的问题:

我想要做的是将数据输入到结构指针数组,然后将其打印出来。但是当我遇到插入函数时,我遇到了分段错误。

以下是我的代码

COMMON.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);

insert.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;

}

的main.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;
}

4 个答案:

答案 0 :(得分:3)

主要问题:

在使用

之前为p->name分配内存
strcpy(p->name, name);

使用malloc

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

其他问题:

  1. 删除演员阵容:

    p = (Book)malloc(sizeof(struct book));
    

    为什么呢? Here is the answer

  2. if(b_insert(b, id, name) == -1){永远不会成真。
  3. 检查malloc的结果,检查它是否成功分配内存。
  4. 检查所有scanf的返回值,看它是否成功扫描数据。
  5. 将长度修饰符添加到第二个scanf以防止缓冲区溢出:

    scanf("%9s", name); /* +1 for the NUL-terminator */
    

答案 1 :(得分:3)

您没有为名称分配空间:

int b_insert(Book *b, int id, char *name){
    Book p; 
    p = malloc(sizeof(struct book));
    if (p != NULL)
    {
       p->name = malloc(strlen(name)+1); // It allocates space where the input name will be copied.

       if (p->name != NULL)
       {
          p->id = id;
          strcpy(p->name, name);

          *b = p;
          printf("success insert book:\n");
          printf("\tID: %d Name: %s\n", (*b)->id, (*b)->name);
       }
       else return -1; // No space to allocate string
    }
    else return -1; // No space to allocate struct

    return 0;
}

答案 2 :(得分:0)

如前所述,为p->name分配空间。您可能还应该使用不同的东西来读取书名,扫描格式%ms带有指向字符指针的指针,或者%9s带有缓冲区,否则标题为#34; war or peace&#34;也会导致段错误。

答案 3 :(得分:-1)

在这里,您可以创建一个静态变量,并为其自动分配空间。

  

预订p;

当您将空间分配给指针时,可以手动分配空格,在此行中它不是指针而是静态变量。

  

p =(Book)malloc(sizeof(struct book));

如果你想引用你应该使用的静态变量属性&#34;还有什么呢?&#34;。&#34;而不是&#34; - &gt;&#34;。所以你有两个选择。创建一个指针并为结构分配一个空间然后你&#34; - &gt;&#34; oraz创建静态变量。

  

p-&gt; id = id;