Перераспределение на тот же размер вызывает недопустимую ошибку следующего размера - PullRequest
0 голосов
/ 16 мая 2019

Так что это сложно объяснить, но я буду стараться изо всех сил.

Я получаю

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 аргументами это работает. Я думал о том, чтобы проверить, является ли размер тем же самым, но я чувствую, что я убегаю от проблемы.

...