【发布时间】:2016-06-11 02:30:02
【问题描述】:
我希望实现一个简单的数据结构,比如链表,但我不需要任何复杂的东西,或者我需要吗?
假设我有一个图书数据结构。
typedef struct {
char* name;
size_t number;
} book;
我想将这些附加到越来越多的书籍列表中,这些书籍在内存中应该看起来像这样。
------------------------
| 0 | 1 | 2 | 3 | ......
------------------------
因为我除了添加一堆书并且从不改变顺序并且只在程序结束时释放书籍之外没有做任何花哨的事情,所以我不需要链表的所有功能。
我试图用这样的双指针来创建书籍的原始结构。
public book** add_bookd(book** books, book* b) {
static int index = -1;
int count;
index++;
count = index + 1;
book** books = realloc(books, sizeof(book*)*count);
books[index] = calloc(1, sizeof(book));
copy_bookd(books[index], b); //this is just a series of memcopy
//since i have POD data types
return books;
}
我用一个非常简单的字符尝试过,但我遇到了段错误。
char** double_pointer(char** a, char* b) {
static int index = -1; int count;
index++;
count = index + 1;
a = realloc(a, sizeof(char*)*count);
for(int i = 0; i < index; i++) {
a[i] = calloc(1, sizeof(char));
a[i] = b;
printf("%s\n",a[i]);
}
return a;
}
char** tmp = calloc(1, sizeof(char*));
for(int i = 0; i < 3; i++) {
double_pointer(tmp, "a");
//printf("%s\n",tmp)); //seg faults here
}
这是用链表更好地实现的东西吗?为什么我会出现段错误?我的意思是 gdb 显示我在那条线上崩溃了。
当我打印 tmp gdb 报告的值时
p tmp $1 = (char **) 0x0
尝试访问 tmp[0] gdb 表示无法访问 0x0 处的内存。
【问题讨论】:
-
public在 C 语言中? -
static int index = -1;:这是个坏主意。因为它只能作为一个持续的过程。换句话说,你将无法处理另一个链表。 -
tmp是char **(指向指针的指针),而不是空终止字符串的开头。 -
您似乎有某种误解,但很难说出那是什么,因为您没有提供一个完整的程序来证明您的问题。如果您提供MCVE,我们可以为您提供更好的帮助。
-
在调用任何内存分配函数(malloc, calloc, realloc()时总是检查(!=NULL)返回值以保证操作成功。调用
realloc()时不要直接赋值返回值到目标点。因为如果realloc()失败(它可以做到),那么分配内存的原始点(在这种情况下为a)将被覆盖/丢失。这会导致内存泄漏以及对 @987654335 的任何后续访问@ 是未定义的行为,可能导致段错误事件。相反,使用临时指针并在分配给目标指针之前检查临时指针不为 NULL
标签: c pointers memory-management