realloc():无效指针中止(内核转储)

realloc():无效指针中止(内核转储),c,memory,realloc,coredump,C,Memory,Realloc,Coredump,我正在创建一个类似于bash的shell。在尝试获取与命令(即ls-l)关联的参数时,我遇到了一个错误。我在网上搜索过,没有找到任何有用的东西 char *userInCopy; char *ret; userInCopy = (char*)calloc(1024, sizeof(char)); ret = (char*)calloc(64, sizeof(char)); strcpy(userInCopy, userIn); int i = 0; while((ret = strsep(&am

我正在创建一个类似于bash的shell。在尝试获取与命令(即ls-l)关联的参数时,我遇到了一个错误。我在网上搜索过,没有找到任何有用的东西

char *userInCopy;
char *ret;
userInCopy = (char*)calloc(1024, sizeof(char));
ret = (char*)calloc(64, sizeof(char));
strcpy(userInCopy, userIn);
int i = 0;
while((ret = strsep(&userInCopy, " "))){
    *(args + i) = (char*)calloc(strlen(ret), sizeof(char));
    strcpy((*(args+i)), ret);
    i++;
    ret = (char*) realloc(ret, (64)* sizeof(char));
} 

我在char userIn中从用户处获得输入,并且正确分配了输入。然后,我使用strep解析输入,分别获取每个参数。我可以得到ls参数和-l参数,但是当它在-l之后转到realloc时,它会给我一个“realloc():invalid pointer”错误。我不明白为什么在得到ls参数后第一次这样做,但是在得到-l参数后失败了。有什么建议吗?

问题是您正在用
strep
返回值覆盖
ret

while((ret = strsep(&userInCopy, " "))) //Here
使用另一个临时变量来存储strepreturn


ptr
必须由先前对malloc()和calloc()的调用返回 或realloc()


您给出的尺寸是新的总尺寸。这不是它应该增加多少额外的东西。还要注意的是,您永远不应该重新分配给传入的指针,因为
realloc
可能会失败并返回
NULL
,在这种情况下,您将丢失原始指针。最后,在C语言中,请注意,
strep
函数是POSIX标准函数,而不是C标准函数。只是让你知道你是否想在其他平台上使用它。风格要点:不要使用
*(args+i)
。相反,使用等效但更清晰的参数,
args[i]
。但是,临时返回值是否也需要为循环的每次迭代分配和重新分配内存,从而使我回到当前的问题?不,你的临时变量不需要内存分配,所以我也要修改它:char*temp;而((temp=strep(&userInCopy,“”){…strcpy(args[i],temp);}@epartridge是。
void *realloc(void *ptr, size_t size);