Так что это сложно объяснить, но я буду стараться изо всех сил.
Я получаю
realloc (): неверный следующий размер Прервано (дамп памяти)
Но только когда я пытаюсь переместить вектор в прежний размер.
Программа считывает ввод с терминала в этом формате с максимум 3 аргументами:
p1 p1arg1 p1arg2 -> p2 p2arg1 p2arg2 p2arg3
Затем он приступает к токенизации и получает путь, имя программы и аргументы, готовые для использования SVC execv. (Например.):
execv (prog_path, prog_args);
, где
prog_path равно "путь / к / p1"
и
prog_args - "p1", "p1arg1", "p1arg2", NULL
PS: в примере 2 аргумента, но execv должен иметь имя программы и NULL в качестве первого и последнего элементов.
Итак, у меня есть эти две функции, и main просто вызывает их по порядку:
// current terminal input
char* input;
void read_input() {
// reads input from terminal
size_t bufsize = 32;
input = (char *)malloc(bufsize * sizeof(char));
getline(&input,&bufsize,stdin);
input[strcspn(input, "\n")] = 0;
}
void op_execute() {
// Tokenize input
// Example: [prog1] [arg1] [->] [prog2] [arg1] [arg2]
char* token = strtok(input, " ");
while (1) {
// First token is program path
char* prog_path = token;
token = strtok(NULL, " ");
// Next tokens are program arguments
// First arg is prog name and last arg is NULL
char** prog_args;
prog_args = malloc(5);
char* prog_name = strrchr(prog_path,'/');
if (prog_name) {
prog_args[0] = malloc(strlen(prog_name));
strcpy(prog_args[0],prog_name);
}
else {
prog_args[0] = malloc(strlen(prog_path));
strcpy(prog_args[0],prog_path);
}
int i = 1;
while (token && strcmp(token,"->") != 0) {
prog_args[i] = (char*) malloc(strlen(token));
strcpy(prog_args[i],token);
token = strtok(NULL, " ");
i++;
}
prog_args = realloc(prog_args,(i+1));
prog_args[i] = NULL;
// TEST
printf("program: %s\n",prog_path);
for(int j=0;j<=i;j++) {
printf("arg(%d): %s\n",j,prog_args[j]);
}
if (!token) {
break;
}
token = strtok(NULL, " ");
}
}
Ошибка будет только в том случае, если есть 3 аргумента, с 0,1 или 2 аргументами это работает. Я думал о том, чтобы проверить, является ли размер тем же самым, но я чувствую, что я убегаю от проблемы.