为什么我的代码会给我垃圾值,有时会出现分段错误?

时间:2018-03-23 05:08:32

标签: c segmentation-fault

我试图在给定2个已排序链接列表的情况下实现merge(),并输出合并这两个列表的链接列表并进行排序。我首先创建一个数组并将项目放在那里,但是当我打印数组元素时,我得到垃圾值/ seg错误。我知道要经历的代码很多,但我非常感谢任何可以提供帮助的人:)

typedef struct _node {
    int data;
    struct _node * next;
} node_t;

typedef struct {
    node_t * head;
    node_t * tail;
} LL_t;

LL_t* createList(int num_nodes);
void printList(LL_t* L);
void merge(LL_t * L, LL_t * L2);

void merge(LL_t * L, LL_t * L2){
    if(L2->head==NULL){ // empty L2
        free(L2);
        return;
    }
    else if(L->head==NULL){ // empty L1
        *L=*L2;
        free(L2);
        return;
    }

    node_t* node=L->head;
    int mid=0;
    if(node->next!=NULL){
    for (mid=0; node->next!=NULL; mid++) //finds last index of L1
        node=node->next;
    }

    L->tail->next=L2->head;
    L->tail=L2->tail;
    node_t* ind = L->head;
    free(L2);
    int len=0;
    for (len=0; ind!=NULL; len++) // finds num of items in list
        ind=ind->next;

    int arr[len];
    int newarr[len];
    node_t* cur= L->head;

    for(int i=0; cur!=NULL; i++){ // creates array with list items
        arr[i]=cur->data;
        cur=cur->next;
    }

    int first=0;
    int last=len;
    int leftpos=0;
    int rightpos=mid+1;
    int newpos=0;


    //  insert elements to arr until a half of the array
    //  reaches mid or last
    while(leftpos<=mid && rightpos<=last-1){
        if(arr[leftpos]<arr[rightpos]){
            newarr[newpos++]=arr[leftpos++];
        }
        else
            newarr[newpos++]=arr[rightpos++];
    }

    // fills in the rest of the array
    while(leftpos<=mid)
        newarr[newpos++]=arr[leftpos++];
    while(rightpos<=last)
        newarr[newpos++]=arr[leftpos++];
    for(int j=0; j<len; j++)
        printf("newarr=%d\n",newarr[j]); 

    }

int main(void){
    int num_nodes = 4;
    int num_nodes2 = 3;
    LL_t* L=createList(num_nodes);
    LL_t* L2=createList(num_nodes2);
    merge(L, L2);

}
// Creates the list. No problem here
LL_t* createList(int num_nodes){
    LL_t* L = malloc(sizeof(LL_t));
    L->head=NULL;
    L->tail=NULL;
    node_t *n;
    int i=0;
    for (i = 0; i < num_nodes; i++) {
        n = malloc(sizeof(*n));
        scanf("%d",&n->data);
        n->next = NULL;
        if (L->head == NULL){
            L->head = n;
            L->tail = n;
        } 
        else {
            L->tail->next = n;
            L->tail = n;
        }
    }
    puts("\n");
    return L;
    }

1 个答案:

答案 0 :(得分:6)

问题出现在merge()

while(rightpos<=last)
    newarr[newpos++]=arr[leftpos++];
                         ^^^^^^^

此处,while循环的条件为rightpos<=last,但访问leftpos的{​​{1}}索引元素并递增它。如果arr小于rightpos,则last循环条件将始终为while,这使其成为无限循环。 true循环的每次迭代都在递增while,在一个阶段,它的值将大于数组leftpos的大小,并且访问超出数组大小的数组元素是{{3其中包含程序可能会给出分段错误。它应该是:

arr