2013-03-29 5 views
1

반복 요소없이리스트 Lb와 La를 결합하고자하는 샘플 테스트 일뿐입니다. 그것은 작동하고 -1073741510을 반환, 나는 어쩌면 배열 오버 플로우를 생각하지만, 문제가왜이 C 프로그래밍을 올바르게 실행할 수 없습니까?

어디 있는지 찾을 수 없습니다되지 않았습니다 내 코드입니다 :

#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; 
} 
+0

첫 번째 문제는 La와 Lb에 메모리를 할당하지 않았다는 것입니다. main()에서 for 루프를 사용하기 전에 malloc을 사용하여 메모리를 할당하십시오. – user1596193

+0

코드를 더 쉽게 이해하려면 :'GetElem (L, i, & e)'대신'L (j)'와'e (L + j)'대신'L [j]'를 사용하십시오. – jop

+0

또한 (더 많은) 메모리를 다시 할당하지 않고도 문자 배열에 데이터를 추가 할 수 없습니다. – Ionic

답변

4

첫째, 이것은 잘못된 것입니다 :

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

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

당신은 그들을 선언함으로써, 예를 들어, LaLb 메모리를 확보 할 필요가

다음이 :

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

읽어야합니다

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

마지막으로, 당신은 가능성이 가장 높은 for 종료 조건으로 <= 대신 <를 사용하여 너무 많은 한 번 반복하고 있습니다.

+1

원래 코드를 보면 La [12]/Lb [12] 이상이어야합니다. 끝에 NUL 문자가 추가되어 있기 때문입니다. 아아, 내게서 +1. – Ionic

+1

'GetElem (Lb, i, & e)'가 될 것입니다. 그는'e'를 포인터로 선언했으며 초기화에 실패했습니다. –

+0

둘 다 옳습니다. 내가 제안한대로 방금 편집했습니다. – jop

0

몇 가지 문제가 있습니다. 원시 포인터, 고정 길이 배열, 가변 길이 arras 및 동적 배열에 대해 자세히 알아야한다고 생각합니다. 배열이 커지려면 malloc 및 realloc을 사용하여 동적으로 만들 수 있습니다. 또는 결코 오버플로하지 않는 "큰"배열을 사용할 수 있습니다.

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

그러나 이것은 고정되어있어 커질 수 없습니다. 사용할 수 있습니다

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

일반적으로 동적 배열이 필요합니다.

또한 배열에 0을 보유 할 수 있거나 터미네이터로 사용하는 경우를 결정해야합니다. '\0'0은 사용하는 형식이 동일합니다. 첫 번째 요소가 0이기 때문에 많은 사이클이 실행되지 않습니다.

+0

대단히 고마워요. 당신이 나에게 말하기 전에 '\ 0'이 0과 다르다고 생각했고, 문제가 어디에 있는지 압니다. 정말로 더 배워야한다고 생각합니다. – winterszhang

관련 문제