2012-02-26 3 views
1

그래서 두 가지 (잘만하면 빠름) 질문이 있습니다. malloc을 사용하여 데이터 공간을 절약 할 수 있다고 생각하지만 realloc은 문제를 일으키고 있습니다. 내가 (그래서 다음 다른 8 등) 다른 8 문자 포인터를 가지고 확장하기 위해 노력하고있어 - 그것까지 작성해야합니다 - 아래의 코드에서, 나는 8 문자 포인터의 배열을 가지고있다. realloc을이를 처음 (즉, 한번 배열을 확장합니다) 않지만, 그 후 나는 다음과 같은 오류 얻을 : 내가 말할 수있는 C-malloc, realloc 및 free에서 적절한 메모리 처리를 배우려고합니다.

*** glibc detected *** ./a.out: realloc(): invalid next size: 

는 지금까지 아무것도 변경되지 않습니다를. 왜 realloc은 8의 배열에서 작동하지만 16의 배열에서는 작동하지 않습니까?

그리고 내 두 번째 질문은 메모리 누수에 관한 것입니다. 나는 아직도 프로그램에서 무료로해야 할 것이 무엇인지 확신 할 수 없다. 나는 inputcpy가 해방되어야한다는 다른 사람들의 조언을 받았다. 그게 다 여기 있니? 또한, 프로그램의 어느 시점에서 그것을 무료로하고 싶습니까?

#define DEBUG 1 

#include <string.h> 
#include <stdlib.h> 
#include <stdio.h> 

char ** getArgs(char *input, char **args, int ct); 
char ** args; 

int main(int argc, char* argv[]) { 
    char input[]="echo arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 arg11 arg12 arg13"; 
    char inputcpy[strlen(input)]; 
    strcpy(inputcpy, input); 
    char * prog=strtok(input, " "); 

    /*Saving space for an array of 8 strings*/ 
    args=(char **) calloc(8, sizeof(char *)); 

    getArgs(inputcpy, args, 1); 

    if(DEBUG) { 
    printf("arg address after: %p\n", args); 
    } 

    int q; 
    int pid=fork(); 
    if (pid==0) { 
    execvp(prog, args); 
    return 0; 
    } 
    else { 
    int status=0; 
    wait(&status); 
    } 
} 

char ** getArgs(char *input, char **args, int ct) { 
    int adj=(ct-1)*8;//if we recurse, this ensures correct indexes are used 
    char *inputcpy=malloc(strlen(input)); 
    strcpy(inputcpy, input); 

    /*Initialize indexes/Prepare for copying*/ 
    int i; 
    if(ct==1) { 
    i=1; 
    args[0]=" "; //quick hack to ensure all args are used by exec() 
    } 
    else 
    i=0; 

    /**Actually do the copying now**/ 
    char *temp=strtok(NULL, " "); 
    args[adj+i++]=temp; 
    while (temp != NULL && i<8) { 
    temp=strtok(NULL, " "); 
    args[adj+i++]=temp; 
    } 

    /*If there are more args than we have room for*/ 
    if(i>=8){ 
    /*Increase the array to store 8 more strings*/ 
    args= (char **) realloc(args, sizeof(args)+8*sizeof(char *)); 
    getArgs(inputcpy, args, (++ct)); 
    } 

    return NULL; 
} 
+1

대충 훑어 봐야 할 코드가 많아서 나는 겁 먹고 요약 할 것입니다. 당신이'새로운'무엇인가 있다면,'삭제 '하십시오. 당신이'malloc'을 무언가를'자유롭게 '한다면. 'sizeof'는'args' (포인터)의 크기를 알려주지 만 포인터는 가리키는 것이 아니라 당신의 버그입니다. –

+0

널 문자를 고려해야하므로'char * inputcpy = malloc (strlen (input));''char * inputcpy = malloc (strlen (input) + 1); '이어야합니다. –

답변

2
char *inputcpy=malloc(strlen(input)); 
strcpy(inputcpy, input); 

당신이 당신의 문자열에 대한 충분한 공간을 할당되지 않습니다해야한다 : malloc(strlen(input) + 1);

동일 여기

:

char inputcpy[strlen(input)]; 
strcpy(inputcpy, input); 

문자열이 널 (null)을 포함 종료 문자의 순서이며, 문자 및 문자열의 길이는 null 문자 앞에 오는 문자 수입니다.

은 또한 잘못 realloc을 사용하고 있습니다 :

args= (char **) realloc(args, sizeof(args)+8*sizeof(char *)); 

이 사용중인 메모리 누수의 가능성이 있습니다.

free에 관해서는 간단합니다. 모든 malloc에는 free이 있어야합니다.

+0

답장을 보내 주셔서 감사 드리며 null char에 대한 공간 부족을 지적 해주십시오! 나는 당신의'realloc' 코멘트에 대한 질문을 가지고 있습니다. realloc가 이미 args를 재 할당하면 이전 args를 해제 할 수 있습니까? 'var = realloc (var, size)'를 사용하는 것은 나쁜 습관입니까? – user1209326

+0

@ user1209326 네,'realloc'이'NULL'을 반환하면'args'를 덮어 쓰게되고 원래의'args'를'free' 할 수 없기 때문입니다.귀하의 코드에서 귀하의 프로그램을 임의의 문제에 노출시키는 라이브러리 함수의 반환 값을 확인하지 마십시오. – ouah

0

나는 그것이 당신의 마지막 질문에 응답 할 것이다 : 은 또한, 프로그램의 어떤 시점에서 내가 그것을 해제하고 싶어를?

글쎄, 당신이 바로 malloc을 호출 한 함수의 반환 stament 전에 무료 것을 추천합니다. 그렇게하면, 메모리 누수에 대해 걱정할 필요가 없습니다.

그러나, 호출 기능은 귀하의 경우 메인에, 또한 호출 할 수 있습니다 무료() 당신의 getArgs() 함수가 끝나고 돌아 메인으로 제어를 할 때. 이것은 free()와 다른 포인터 변수를 사용하는 것이 좋기 때문입니다. 새 포인터가 동일한 주소를 저장하는지 확인해야합니다.