Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在结构中创建数组?分段故障_C_Segmentation Fault_Dynamic Memory Allocation - Fatal编程技术网

C 在结构中创建数组?分段故障

C 在结构中创建数组?分段故障,c,segmentation-fault,dynamic-memory-allocation,C,Segmentation Fault,Dynamic Memory Allocation,我编译了少量的C代码,当我运行它时,我得到了一个分段错误 它在create_index()函数的第一行停止,即使我有权访问指针的地址。我不知道发生了什么事 main.c 第一件事,当您遇到分段错误时,尝试使用内存调试器调试代码,如。大多数情况下,它将指出错误的代码块 从您发布的代码中可以看出,您没有为HTinfo*head分配任何内存,并试图将地址(无效)传递到create_index(),然后,在不进行任何检查的情况下,将其取消引用。由于内存位置无效,这是一种未定义的行为情况,很可能导致分段错

我编译了少量的
C
代码,当我运行它时,我得到了一个分段错误

它在
create_index()
函数的第一行停止,即使我有权访问指针的地址。我不知道发生了什么事

main.c
第一件事,当您遇到
分段错误时
,尝试使用内存调试器调试代码,如。大多数情况下,它将指出错误的代码块

从您发布的代码中可以看出,您没有为
HTinfo*head
分配任何内存,并试图将地址(无效)传递到
create_index()
,然后,在不进行任何检查的情况下,将其取消引用。由于内存位置无效,这是一种未定义的行为情况,很可能导致分段错误,就像您的情况一样

此外,最好的做法是在声明指针时始终初始化指针,并检查函数的传入指针变量的有效性。您应该使用
HTinfo*head=NULL
main()
中初始化
head
,并且可能需要在
create_index()
函数本身中添加
NULL
检查,这将帮助您检测向函数传递无效(NULL)地址的情况(以防忘记分配内存)并且还可以防止代码崩溃。你可以用像

if (*head != NULL)
{
     //your code
}
else
{
     //print appropriate error message, return/exit
}

您没有为
分配内存。
main
中的
malloc

HTinfo * head = malloc(sizeof *head);
if(NULL == head) // handle out-of-memory
或在
创建索引中:

*head = malloc(sizeof **head);
if(NULL == *head) // handle out-of-memory
main()
中,您正在分配指向
HTInfo
结构的指针。您可以静态地分配整个结构,并将指针传递到
create\u index()

并处理
create_index()中的指针


您没有为
(在
)或
*头
(在
创建索引
)分配以下内容:
(*头)->空=1;'
*head`或
head
中没有有效的内存指针。错误如其他人所说。如果您在主调用中初始化了值:HTinfo*head=NULL,可能会更加明显。如果没有初始值,在“c”中,它可能是任何东西……您可以使用一些关于c的读数。这里有一些很好的参考:注意,
*head
签入
create_index()
不保证工作,因为
main()中的指针
未初始化,因此它可能不是空指针。@JonathanLeffler感谢您提到这一点。我更新我的答案。
if (*head != NULL)
{
     //your code
}
else
{
     //print appropriate error message, return/exit
}
HTinfo * head = malloc(sizeof *head);
if(NULL == head) // handle out-of-memory
*head = malloc(sizeof **head);
if(NULL == *head) // handle out-of-memory
HTinfo *head;
int main(void)
{
    HTinfo head;
    create_index(&head);
    // continue ...
    // you should be testing for the return value of create_index()
int create_index(HTinfo *phead)
{
    int i;
    phead->empty = 1;
    phead->index = calloc(101, sizeof(nodeptr));
    if (phead->index == NULL)
        return -1;
    // continue ...