熟悉指针?

时间:2014-09-18 03:42:12

标签: c pointers strtok

我不可能是唯一一个开始被所有星号感到不知所措的人...... 如果你发现这个问题多余,我很抱歉,但我真的无法应用我已经读过的关于这个特定实例的指针概念。 我试图弄清楚为什么每次运行这段代码时都会得到一个核心转储:

#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 []的每个元素设置为指向每个标记的开头。我认为我的麻烦是真的不知道如何以适合此目的的方式引用数组。我该怎么做才能解决这个问题?

感谢。

1 个答案:

答案 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内存可能是一个完全虚假的举动。改为使用动态(堆分配)或堆栈(本地或堆分配)。