我是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
的结果以检查它是否成功分配内存。检查所有
scanf
s的返回值,看它是否扫描数据成功。在第二个
scanf
中添加长度修饰符以防止缓冲区溢出:scanf("%9s", name); /* +1 for the NUL-terminator */
关于c - 使用malloc的段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31264927/