有谁知道为什么这个重新分配代码不起作用?
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();
..
}
提前致谢。
答案 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);