为什么我的C代码打印分段错误:11?

时间:2017-04-17 03:28:54

标签: c

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”?

“指针指针”可以被视为数组吗?

4 个答案:

答案 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*));