내 함수는 다른 것들 중에서도 인수가있는 명령을 구성하는 단어에 대한 포인터의 NULL 종료 배열을 포함하는 구조체를 전달 중입니다.더 많은 char 포인터 목록으로 char 포인터 배열을 덮어 쓰는 방법은 무엇입니까?
인수 목록에서 glob match를 수행하여 전체 파일 목록으로 확장 한 다음 전달 된 인수 배열을 새 확장 된 것으로 대체하려고합니다.
globbing이 제대로 작동합니다. 즉, g.gl_pathv가 예상 파일 목록으로 채워집니다. 그러나, 주어진 구조체에이 배열을 복사하는 데 문제가 있습니다.
#include <glob.h>
struct command {
char **argv;
// other fields...
}
void myFunction(struct command * cmd)
{
char **p = cmd->argv;
char* program = *p++; // save the program name (e.g 'ls', and increment to the first argument
glob_t g;
memset(&g, 0, sizeof(g));
g.gl_offs = 1;
int res = glob(*p++, GLOB_DOOFFS, NULL, &g);
glob_handle_res(res);
while (*p)
{
res = glob(*p, GLOB_DOOFFS | GLOB_APPEND, NULL, &g);
glob_handle_res(res);
}
if(g.gl_pathc <= 0)
{
globfree(&g);
}
cmd->argv = malloc((g.gl_pathc + g.gl_offs) * sizeof *cmd->argv);
if (cmd->argv == NULL) { sys_fatal_error("pattern_expand: malloc failed\n");}
// copy over the arguments
size_t i = g.gl_offs;
for (; i < g.gl_pathc + g.gl_offs; ++i)
cmd->argv[i] = strdup(g.gl_pathv[i]);
// insert the original program name
cmd->argv[0] = strdup(program);
** cmd->argv[g.gl_pathc + g.gl_offs] = 0; **
globfree(&g);
}
void
command_free(struct esh_command * cmd)
{
char ** p = cmd->argv;
while (*p) {
free(*p++); // Segfaults here, was it already freed?
}
free(cmd->argv);
free(cmd);
}
편집 1 :에서 팁을 편집 MEM 관리 : 추가 전화
편집 3은 calloc하기 : 또한, 나는 cmd->는 argv [0]
편집 2로 나는 다시 거기에서 프로그램을 고수 할 필요가 실현 알록
편집 4 : ALOK
편집 (5)에서 더 많은 정보 : 명령 구조체 마지막으로
를 해제 할 때 거의 .. 응용 프로그램의 세그먼테이션 폴트 (segfault) 작업 :
: 나는 그래서 줄을 추가, 종단 NULL 누락 된 것 같다cmd->argv[g.gl_pathc + g.gl_offs] = 0;
이 효과가있는 것으로 보입니다.
이제 작동합니까? 그렇지 않다면 어떤 오류가 발생합니까? 또한 가장 최근의 편집 내 대답을 참조하십시오. 'paths [0]'에 대해 두 번,'malloc'에 한 번,'strdup '으로 다시 공간을 할당하고 있습니다. –
예, 그 코드는 무척 까다 롭습니다. 최신 편집을보십시오. 새 배열에 액세스 할 때 여전히 충돌이 발생합니다. 아마도 \ 0 문자가 셔플에서 길을 잃고 있습니까? – Casey
'cmd-> argv [g.gl_pathc + g.gl_offs] = '\ 0';'에서' '\ 0''은'NULL'과 같은'0'과 같습니다. ' '\ 0' '대신에'NULL'을 사용하십시오. –