2013-08-30 1 views
-1

라고 오류 : 분할 오류 (코어 덤프) 무료 방법은 내가 문자의 배열을위한 메모리 공간을 확보하기 위해 노력하고

 static void cleanArray(char* array) 
       { 
        int i; 
        int size = strlen(array) + 1; 
        for(i = 0; i < size; i++) 
         free(array[i]); 
        free(array); 
       } 

    int main(){ 
    char* array = (char *)malloc(1 * sizeof(char*)); 
    int c; 
    for(c=0;c<100;c++){   //code to populate some string values in the array. 
    void *p = realloc(array, (strlen(array)+strlen(message)+1)*sizeof(char*)); 
    array = p; 
    strcat(array, "some string"); 
    } 

cleanArray(array);   //I get error only when I call this method. 
    } 

그러나

위의 코드를 내가 Segmentation fault 오류가 있어요.

그리고 난 그냥 대신 cleanArray의 다음 코드() 나는 배열이 최대 해제 해달라고 생각을하려고하면

free(array); 
printf("%s",array); //it prints all the values in the array. Hence, I concluded it is not freedup. 

답변

1

여러 문제가 있습니다

  1. 당신은 할 필요가 없습니다 문자열의 각 문자에 free()을 호출하십시오. free(array)으로 전화하십시오.
  2. sizeof(char*)malloc()realloc()은 올바르지 않습니다.
+0

+1. 또한,'strlen (array)'는 첫 번째 호출에서 정의되지 않은 결과를 주며, 'message'는''some string' '과 길이가 같지 않으면'strlen (message)'가 잘못됩니다. – simonc

+0

@NPE : 첫 번째 지점을 따라갔습니다. 하지만 printf (배열)를 free (배열) 뒤에 넣으면 모든 문자가 다시 인쇄되는 것을 볼 수 있습니다 ... 두 번째 점은 올바른 방법을 제안 해주십시오. – Arun

+0

@imonc : 테스트 데이터를 확인했습니다. 배열 내부의 문자 수를 나타냅니다. – Arun

4

회선 free(array[i]); 루프에 문제가 있습니다. array[i]은 char 값 (실제로는 정수 승격으로 int 임)이며이 값을 free으로 전달하면 포인터로 간주됩니다. 이제 당신은 당신이 전혀 모르는 그 주소를 해방하려고 노력하고 있습니다.

+0

흠. 감사. 하지만 단순히 무료 (배열); 충분하니? 나는 자유로운 (배열) 후에 저것을 고민한다; printf ("% s", array); 이전에 추가 한 모든 문자를 인쇄 할 수 있습니다. 제발 제안 해주세요. – Arun

+2

'free'는 할당 된 모든 콘텐츠를 삭제하지 않습니다. 다른 작업에는 다시 사용됩니다. 그것은 단지 동적으로 할당 된 메모리 부분이 다른 사람들이 사용할 수 있도록 다시 릴리스됨을 의미합니다. 현재 프로세스가 지금부터 소유하지 않습니다. –

+0

@Uchia Itachi : 귀중한 정보를 주셔서 감사합니다. :) – Arun