render() {
return <Vepo/>
}
结果打印:
#include "stdio.h"
struct List {
int i;
};
int main() {
int c[5] = {3,1,2,5,4};
struct List **list;
printf("----%p\n",list);
struct List one = {0};
struct List two = {1};
list[0] = &one;
list[1] = &two;
printf("One: %p\n", list[0]);
printf("Two: %p\n", list[1]);
return 0;
}
我刚学会了C语言。这里有什么问题?然后,如果我删除“int c [5] = {3,1,2,5,4}”的行,代码工作正常。但它打印出来:
----0x0
Segmentation fault: 11
为什么地址“(1”不同于“(2”?
“指针指针”可以被视为数组吗?
答案 0 :(得分:4)
您尚未向list
分配任何内存,因此对其应用索引运算符会导致未定义的行为。
通过分配一个指向list
的两个指针的数组来修复它:
struct List **list = malloc(2 * sizeof(List*));
请注意,使用%p
打印需要传递void*
:
printf("----%p\n", (void*)list);
...
printf("One: %p\n", (void*)list[0]);
printf("Two: %p\n", (void*)list[1]);
最后,你需要在完成后释放指针以避免内存泄漏:
free(list);
return 0;
答案 1 :(得分:1)
问题是由于这个原因 -
struct List **list; // <--- not initialized
那么这些陈述 -
printf("----%p\n",list);
//your code
list[0] = &one;
list[1] = &two;
取消引用未初始化的指针,该指针会导致未定义的行为,从而导致分段错误。
使用list
(或malloc
)将内存分配给calloc
,然后将其取消引用以存储值。
答案 2 :(得分:1)
这是因为这两行,或者更确切地说是第一行。
list[0] = &one;
list[1] = &two;
您需要先为list
分配内存,然后才能推荐它。
像
这样的东西list = malloc(sizeof(*list) * 100); //for 100 list items
或者创建数组而不是指针
struct List *list[100]; //for 100 list items
答案 3 :(得分:1)
list
永远不会被初始化(将填充堆栈中的任何随机数据),然后通过list[0]
和list[1]
将此随机数据解除引用为ptr。
您可以将list
pt变为类似10 ptrs的数组:
struct List **list = (struct List **) malloc(10*sizeof(struct List*));