循环条件为ptr时的C - 分段错误!= NULL [关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了循环条件为ptr时的C - 分段错误!= NULL [关闭]相关的知识,希望对你有一定的参考价值。

我在循环中在shareRecord中使用ptr!= NULL时遇到分段错误但是当我使用ptr-> next!= NULL时它似乎工作。

因此,当我使用ptr-> next!= NULL并取消注释shareRecord中的行时,代码可以工作。但是为什么它不能仅使用ptr!= NULL。

请告诉我这是什么问题。

struct data *shareRecord(struct data *head, struct data *fileline){
    struct data *ptr;
    ptr = head;
    int flag = 0;
    while(ptr != NULL){
        if((strcmp(ptr->symbol, fileline->symbol) == 0) && (strcmp(ptr->type, fileline->type) == 0 )&& (ptr->time == fileline->time)){
            flag = 1;
            break;
        }
        ptr = ptr->next;
    }
    //if((strcmp(ptr->symbol, fileline->symbol) == 0) && (strcmp(ptr->type, fileline->type) == 0 )&& (ptr->time == fileline->time)){
            //flag = 1;
    //}
    if(ptr->next == NULL && flag == 0){
        return NULL;
    }   
    else
        return ptr;     
}
struct data *create_data(struct data *head, struct data *fileline){
    struct data *newdata, *ptr1, *ptr2;
    struct price *newprice, *priceptr1;
    newprice = (struct price *)malloc(sizeof(struct price *));
    newprice->amt = fileline->price->amt;
    newprice->next = NULL;
    if(head == NULL){

        newdata = (struct data *)malloc(sizeof(struct data));
        newdata->time = fileline->time;
        strcpy(newdata->symbol, fileline->symbol);
        strcpy(newdata->type, fileline->type);
        newdata->price = newprice;
        newdata->next = NULL;
        head = newdata;
    }
    else{
        ptr1 = head;
        ptr2 = head;
        if((ptr1 = shareRecord(head, fileline)) != NULL){
            priceptr1 = ptr1->price;
            while(priceptr1->next != NULL){
                priceptr1 = priceptr1->next;
            }
            priceptr1->next = newprice;
        }
        else{       
            while(ptr2->next != NULL){
                ptr2 = ptr2->next;
            }
            newdata = (struct data *)malloc(sizeof(struct data));
            newdata->time = fileline->time;
            strcpy(newdata->symbol, fileline->symbol);
            strcpy(newdata->type, fileline->type);
            newdata->price = newprice;
            newdata->next = NULL;
            ptr2->next = newdata;
        }
    }
    return head;
}
答案

ptr != NULL导致错误时,循环将中断。这意味着当它破裂时,ptr IS NULL。那么下一行,

if(ptr->next == NULL && flag == 0){

您正在尝试使用NULL的属性,这会导致错误。

以上是关于循环条件为ptr时的C - 分段错误!= NULL [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

打印分段错误原因[重复]

并行运行 MEX 文件时的分段错误

使用字符串时的c ++初学者分段错误

分段错误:shared_ptr

为啥使用动态 ptr 数组检测到分段错误或双重释放?

包含glad.h时的分段错误