그래서 두 가지 (잘만하면 빠름) 질문이 있습니다. 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;
}
대충 훑어 봐야 할 코드가 많아서 나는 겁 먹고 요약 할 것입니다. 당신이'새로운'무엇인가 있다면,'삭제 '하십시오. 당신이'malloc'을 무언가를'자유롭게 '한다면. 'sizeof'는'args' (포인터)의 크기를 알려주지 만 포인터는 가리키는 것이 아니라 당신의 버그입니다. –
널 문자를 고려해야하므로'char * inputcpy = malloc (strlen (input));''char * inputcpy = malloc (strlen (input) + 1); '이어야합니다. –