重新分配为相同的大小会导致无效的下一个大小错误

时间:2019-05-16 16:23:51

标签: c pointers malloc exec realloc

所以这很难解释,但我会尽力而为。

我要

  

realloc():无效的下一个大小已终止(核心已转储)

但是只有当我尝试将向量重新分配为相同的旧大小时。

程序从终端以以下格式读取输入,最多3个参数:

  

p1 p1arg1 p1arg2-> p2 p2arg1 p2arg2 p2arg3

然后继续进行标记化,并获取准备使用SVC execv的路径,程序名称和参数。 (例如):

  

execv(prog_path,prog_args);

其中

  

prog_path是“ path / to / 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个参数)时,才会引发错误。我考虑过要检查尺寸是否相同,但感觉好像我正在解决问题。

0 个答案:

没有答案
相关问题