我不可能是唯一一个开始被所有星号感到不知所措的人...... 如果你发现这个问题多余,我很抱歉,但我真的无法应用我已经读过的关于这个特定实例的指针概念。 我试图弄清楚为什么每次运行这段代码时都会得到一个核心转储:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void parseInput(char *input, char **argv){
printf("%s",input);
int count=0;
char delimit[] = " \t\n\r";
char* token;
/* get the first token */
token = strtok(input, delimit);
argv[count] = &token;
count++;
while( argv[count]!= NULL ) {
printf("%s\n", *argv[count]);
token = strtok(NULL, delimit);
argv[count] = &token;
count++;
}
}
main(){
int bytes_read;
int bytes = 100;
char *input, c;
char prompt[] = "% ";
int length, j;
do{
printf("%s",prompt);
input = (char *)malloc(bytes);
bytes_read = getline(&input, &bytes, stdin);
length = sizeof(input)/sizeof(input[0]);
char *argv[length];
parseInput(input, argv);
free(input);
}while(bytes_read != -1);
return 0;
}
我想要做的是获取输入数组,对其进行标记,然后将argv []的每个元素设置为指向每个标记的开头。我认为我的麻烦是真的不知道如何以适合此目的的方式引用数组。我该怎么做才能解决这个问题?
感谢。
答案 0 :(得分:1)
你走出了argv []的尽头。它不是以NULL结尾的。删除NULL检查并仅从argv中使用/ argc / arguments。
我还建议您使用'valgrind'来解决这类问题 - 这非常有帮助。在这种情况下,输出显示:
==4933== Conditional jump or move depends on uninitialised value(s)
==4933== at 0x4E96BB0: getdelim (iogetdelim.c:101)
==4933== by 0x400792: main (test.c:44)
==4933==
你可以追溯到第44行,你可以在那里进行argv [] fencepost。
此外,根据您的系统,分配到argv内存可能是一个完全虚假的举动。改为使用动态(堆分配)或堆栈(本地或堆分配)。