winterszhang
winterszhang

Reputation: 111

Why this C programming can not run crrectly?

It's just a sample test that I want to unite the list Lb and La without repeat element. It didn't work, and returned -1073741510, I think maybe the array overflow, but I can't find where the problem is

This is my code:

#include <stdio.h>

void Union(char *La, char *Lb);
int ListLength(char *L);
void GetElem(char *L, int i, char *e);
int LocateElem(char *L, char *e, int (*comp)(char a, char b));
int compare(char a, char b);
void ListInsert(char *, int, char *);

int main(){
    char *La;
    char *Lb;
    int i;
    for(i = 0; i <= 10; ++i){
        La[i] = i;
        Lb[i] = i + 5;
    }
    La[i] = '\0';
    Lb[i] = '\0';
    Union(La, Lb);
    for(i = 0; La[i] != '\0'; ++i){
        printf("%c\n", La[i]);
    }
    return 0;
}

//unite La and Lb without repeat elements
void Union(char *La, char *Lb){
    int La_length = ListLength(La);
    int Lb_length = ListLength(Lb);
    int i = 0;
    char *e;
    for(i; i<= Lb_length; ++i){
        GetElem(Lb, i, e);
        if(!LocateElem(La, e, compare))
            ListInsert(La, ++La_length, e);
    }
}

//caculate the length of L
int ListLength(char *L){
    int i;
    for(i = 0; *(L + i) != '\0'; ++i);
    return i;
}

void GetElem(char *L, int i, char *e){
    *e = *(L + i);
}

//search the element e in L, if exist return the location, else return 0
int LocateElem(char *L, char *e, int (*comp)(char a, char b)){
    int i;
    for(i = 0; *(L + i) != '\0'; ++i){
        if(comp(*(L + i), *e)) return i + 1;
    }
    return 0;
}

//compare the element a and b
int compare(char a, char b){
    if(a == b) return 1;
    return 0;
}

//if e doesn't exit in L, insert the e in L
void ListInsert(char *L, int i, char *e){
    int j;
    for(j = ListLength(L) - 1; j >= i; --j){
        *(L + j + 1) = *(L + j);
    }
    L[ListLength(L)] = '\0';
    *(L + i - 2) = *e;
}

Upvotes: 1

Views: 122

Answers (2)

qPCR4vir
qPCR4vir

Reputation: 3571

You have several issues. I think you need to read more about what are raw pointers, fixed length arrays, variable length arras and dynamic arrays. If you need your array to grow you can make it dynamic with malloc and realloc. Alternatively you can use a "big" array you know never will overflow.

int La[12]; //  0 to 10, plus '\0'

But this is fixed and cannt grow. You could use

int La[1000]; // if it solve yours problems

But in general you will need dynamic arrays.

Also, you need to deside if your array can hold 0 or it is used as terminator. '\0' and 0, in the form you use it are equal. Many of your for cycle dont run because the first elemnt is 0.

Upvotes: 0

jop
jop

Reputation: 2316

First, this is wrong:

char *La;
char *Lb;
int i;
for(i = 0; i <= 10; ++i){
    La[i] = i;
    Lb[i] = i + 5;
}

You need to reserve memory for La and Lb, for instance, by declaring them as:

char La[12];
char Lb[12];

An then this:

char *e;
for(i; i<= Lb_length; ++i){
    GetElem(Lb, i, e);

should read:

char e;
for(; i<= Lb_length; ++i){
    GetElem(Lb, i, &e); /* better yet: e=Lb[i] */

Finally, you're most likely looping one time too many by using <= instead of < as the for exit condition.

Upvotes: 4

Related Questions