Realoc:拆分行时下一个大小无效
我的代码将char*行拆分为char***cmds,首先是字符“|”,然后是空格,\n等。示例I/O: I:Realoc:拆分行时下一个大小无效,c,pointers,segmentation-fault,realloc,C,Pointers,Segmentation Fault,Realloc,我的代码将char*行拆分为char***cmds,首先是字符“|”,然后是空格,\n等。示例I/O: I:line=“ls-l/|唯一|排序” O:cmds={{“ls”、“-l”、“/”、NULL}、{unique、NULL}、{sort、NULL}、NULL} 现在,每当它到达第行时,*cmds=realloc(*cmds,nlines+1)超过1个字时会产生错误 ***/a.out中出错:realloc():下一个大小无效:0x000000000114c010***或 a.out:mal
line=“ls-l/|唯一|排序”
O:cmds={{“ls”、“-l”、“/”、NULL}、{unique、NULL}、{sort、NULL}、NULL}
现在,每当它到达第行时,*cmds=realloc(*cmds,nlines+1)代码>超过1个字时会产生错误
***/a.out中出错:realloc():下一个大小无效:0x000000000114c010***
或
a.out:malloc.c:2372:sysmalloc:Assertion(old_top==((mbinptr)((char*)和((av)->bins[(1)-1)*2])-(struct malloc chunk,fd)和&old_size==0)(无符号长)(无符号长)(无符号长)(无符号长)(struct mallu builtin offset)(struct sizoc chunk,fd+)(((struct mallu builtin builtin)offsetof(struct sizu chunk,fd+)和nextsu size==0)(无符号长)(无符号长)(无符号长)(无符号长)(无符号长)(无符号长)(无符号长)(无符号长)(无符号长)(无符号长)(无符号长符号长)(无符号长)(无符号长)(无符号长)(无符号长)(无符号长-1))&&((旧_-top)->大小和0x1)&((无符号长)旧_-end和页面掩码)==0)失败。
任何帮助都将不胜感激,我已经花了好几个小时在上面了
void parse(char *line, char *** cmds)
{
printf("got line %s\n", line);
size_t nlines = 0;
*cmds = NULL;
while (*line != '\0') {
nlines++;
while (*line == ' ' || *line == '\t' || *line == '\n')
*line++ = '\0';
*cmds = realloc(*cmds, nlines+1);
(*cmds)[nlines-1] = line;
(*cmds)[nlines] = NULL;
while (*line != '\0' && *line != ' ' && *line != '\t' && *line != '\n')
line++;
}
**cmds = '\0';
}
void parsePipe(char *line, char ***cmds)
{
char *cmd = strtok(line, "|");
int linesFound = 0;
while (cmd != NULL)
{
printf("Printing word -> %s\n", cmd);
linesFound++;
parse(cmd, cmds++);
cmd = strtok(NULL, "|");
}
printf("This string contains %d lines separated with |\n",linesFound);
}
void main(void)
{
char line[1024];
char **cmds[64] = {0};
while (1) {
printf("lsh -> ");
gets(line);
printf("\n");
parsePipe(line, cmds);
}
}
要修复的样本
void parse(char *line, char *** cmds){
char *cp, *token;
size_t nlines = 0;
*cmds = NULL;
token = strtok_r(line, " \t\n", &cp);
while (token) {
nlines++;
*cmds = realloc(*cmds, sizeof(char*)*(nlines+1));
(*cmds)[nlines-1] = token;
(*cmds)[nlines] = NULL;
token = strtok_r(NULL, " \t\n", &cp);
}
}
void parsePipe(char *line, char ***cmds){
char *cp;
char *cmd = strtok_r(line, "|", &cp);
int i=0, linesFound = 0;
while (cmd != NULL){
//printf("Printing word -> %s\n", cmd);
linesFound++;
parse(cmd, cmds++);
cmd = strtok_r(NULL, "|", &cp);
}
//printf("This string contains %d lines separated with |\n",linesFound);
*cmds = NULL;
}
int main(void){
char line[1024];
char **cmds[64] = {0};
int i;
while (1) {
printf("lsh -> ");
scanf("%1023[^\n]%*c", line);
if(*line == '.' && !line[1])
break;
parsePipe(line, cmds);
//test print
for(i=0; cmds[i]; ++i){
int j=0;
while(cmds[i][j]){
printf("'%s' ", cmds[i][j++]);
}
printf("\n");
}
}
//deallocation
return 0;
}
此处仅分配nlines+1字节:*cmds=realloc(*cmds,nlines+1)代码>。您需要为nlines+1指针留出空间。此外,**cmds='\0
**cmds是指向字符的指针,而不是字符。那你能告诉我怎么修吗?我不知道怎么做,现在也没有时间去学习:/使用模式p=realloc(p,N*sizeof*p)
。这将为N
项分配空间,无论p
指向什么。如果您画出所有字符缓冲区和指针在内存中的位置,您可能会发现更容易理解代码