就像我在标题中所说,我正在尝试从数组生成链接列表。 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;}
答案 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;
}