重新分配打印出错误

时间:2015-11-16 21:44:16

标签: c

有谁知道为什么这个重新分配代码不起作用?

 typedef struct symbol{  
    char **arg; 
    int alloc_pam; 
    } TSymbolPtr

    TSymbolPtr symb;

    symb.arg = realloc(symb.arg, (70));

这是打印出来的错误:

*** glibc detected *** ./ifj: realloc(): invalid next size:     (SIGABRT)

代码示例:

希望它会更加清晰。甚至认为它不会让我发布它,除非我添加更多细节,有可能这个长代码根本不会被发送:(

int rParams_n()
{
  int result;
  actToken = getNextToken();
  result = rType();
  i++;
  if(i >= symb.alloc_pam){
    printf("\trealloc \n");
    symb.arg = (char **)realloc(symb.arg, (symb.alloc_pam) * 2); //error
    symb.alloc_pam *= 2; 
  }
  symb.arg[i] = malloc(sizeof(char*)* ((strlen(actToken.data)) + 1));
  strcpy(symb.arg[i],actToken.data);
  actToken = getNextToken();
...  
}
/* 
 * <params> -> <type> "ID" <params_n> 
 * <params> -> "EPSILON"
*/
int rParams()
{
  count=0;
  if(symb.arg == NULL)
    symb.arg = malloc(sizeof(char *) * (symb.alloc_pam));
  int result;
  // <params> -> "EPSILON" - params je prazdne, cekam ")"
  if (actToken.typ == PZAVORKA) return ERR_CODE_SUCC; // vracim se do rFunc
  // else jedu podle <params> -> <type> "ID" <params_n>

  result = rType();
  if (result != ERR_CODE_SUCC) return result;
  symb.arg[i] = malloc(sizeof(char*) * ((strlen(actToken.data)) + 1));
  strcpy(symb.arg[i], actToken.data);
  count++;
  i++;
  actToken = getNextToken();
    symb.arg[i] = malloc(sizeof(char*) * ((strlen(actToken.data)) + 1));
  strcpy(symb.arg[i],actToken.data);
  actToken = getNextToken();
  // rule rParams_n
  result = rParams_n();
..
}

提前致谢。

3 个答案:

答案 0 :(得分:2)

很难说,因为我们不知道** arg的当前大小,也不知道(70)应该是什么意思。

你的** arg用于分配一个动态的指针数组,是吗?

如果你想在这里分配70个char *你需要使用sizeof(char *)* 70:

symb.arg = (char **) realloc(symb.arg, (sizeof(char *) * (70)));

这当然是假设已经分配了symb.arg - 如果你使用上述方法这样做,那么现在不太可能,但不可能这么说。

然后我们可以使用动态分配的char *来分配缓冲区,这是你想要做的吗?

symb.arg[0] = (char *) malloc(sizeof(char) * (lengthofstring + 1));

例如。希望这会有所帮助,但就像我说的那样,很难说你的程序只有零星的片段被发布。

ETA - 抱歉,我的错误 - 我看到你对malloc()的调用看起来很好,realloc是唯一的区别是你传递指针要调整大小作为第一个参数 - realloc()的第二个参数是与malloc()的第一个也是唯一一个参数基本相同。

答案 1 :(得分:0)

realloc()的第二个参数是 bytes 中的大小,而不是数组条目。它应该始终是数据大小的倍数。

symb.arg = (char **)realloc(symb.arg, (symb.alloc_pam) * 2); //error

symb.arg是指向指针的指针,这意味着字节数必须是sizeof(char*)的倍数。使用文字2仅适用于16位平台。您应该使用sizeof来获取字节数。

symb.arg = (char **)realloc(symb.arg, sizeof(char*) * (symb.alloc_pam) * 2);

答案 2 :(得分:0)

分配空间不足,因为realloc()的第二个参数需要按对象的宽度进行缩放。

不要猜测类型,而是让编译器完成这项工作。

// symb.arg = (char **)realloc(symb.arg, (symb.alloc_pam) * 2); //error

// Notice no type used in this line-of-code
symb.arg = realloc(symb.arg, sizeof *symb.arg * (symb.alloc_pam) * 2);