从数组创建链表时C中的分段错误

时间:2018-03-27 18:49:46

标签: c function linked-list segmentation-fault

就像我在标题中所说,我正在尝试从数组生成链接列表 P 结构,包含 float x 指针指向列表中的下一个元素。一旦调用 gen_list 函数,第一行代码“first-> x = V [0]”就会返回分段错误,这是我从调试器得到的:

Program received signal SIGSEGV, Segmentation fault.                                                                 
0x00000000004007f6 in gen_list (V=0x602010, n=10000, first=0x601068 <first>)                                          
    at main.c:46                                                                                                     
46              (*first)->x = V[0];                                                                                   
(gdb)

我似乎无法找到问题,请帮助!!

以下是重新创建错误所需的最少量代码:

typedef struct Popis {
float x;
struct Popis *next;}P;
P *first;

int main(){
float v[10];
v[0] = 1;
first->x = v[0];
}

我的代码:

P* gen_list(float V[], int n, P *first) {
first->x = V[0];
P *T = NULL;
P *new = NULL;
T = first;

t1 = clock();
for (int i = 1; i < n; i++) {
    new->x = V[i];
    T->next = new;
    T = new;
}
T->next = NULL;
t2 = clock();
printf("\nTime for creation of linked list is: %dms", t2 - t1);
return first;}

2 个答案:

答案 0 :(得分:1)

当指针操作错误时,通常会发生分段错误,例如在示例代码中:

typedef struct Popis {
  float x;
  struct Popis *next;
} P;
P *first;

int main(){
  float v[10];
  v[0] = 1;
  first->x = v[0];
}

看一下变量 * first ,是一个指向Popis结构的指针,现在在函数中尝试使用 * first 指针,但你需要分配一个内存空间才能使用它。如果使用以下代码在使用前分配内存,则不会发生分段错误错误。

first = (P*)malloc(sizeof(P));

答案 1 :(得分:0)

问题很可能是由于缺少分配的内存。在“需要的最少代码量”代码片段中,没有为您的结构分配内存,这就是该进程被终止的原因。内核返回SIGSEGV信号,因为您尝试在尚未由程序分配(请求)的内存上写入。要解决此问题,您可以使用malloc();简单地分配内存。我希望下面的代码可以帮助您解决问题:

#include <stdio.h>
#include <stdlib.h>

typedef struct Popis {
    float x;
    struct Popis *next;
}P;

int main(){

    P *first;
    /*Here we actually create the structure in the memory - we allocate memory for it*/
    first = (struct Popis*)malloc(sizeof(struct Popis));
    /*This is a simple check if the memory allocation was sucessfull*/
    if(!first) 
    {
        fprintf(stderr, "Error has occured during the memory allocation!\n");
        exit(1);
    }

    float v[10];
    v[0] = 1;
    first->x = v[0];
    printf("%f", first->x);

    return 0;
}