单步执行直到退出函数__svfscanf_l,该函数没有行号信息

时间:2012-10-16 03:16:39

标签: c++ c

我正在制作一个C程序。我有一个功能,一切似乎都很好。但是,如果我添加另一个变量,它突然不起作用,我得到一个分段错误。 (如果我使用gdb,我会收到错误:单步执行直到退出函数__svfscanf_l, 没有行号信息。程序收到信号:“EXC_BAD_ACCESS”。)

这是我的功能:

void condition(char *command) {
printf("CAMMAND: %s\n", command);
char *cond;
char *expression;
char *file;
char *buffer;
buffer = malloc(200 * sizeof(char));

sscanf(command, "%s ( %s %s ) %[^\n]", cond, expression, file, buffer);

printf("COND: %s\n", cond);
printf("EX: %s\n", expression);
printf("File: %s\n", file);
printf("Command: %s\n", buffer);

if (!strcmp(expression, "checke")) {
    printf("CHECK EXISTS\n");
    if (file_exists(file)) {
        printf("EXISTS\n");
    }
} else if (!strcmp(expression, "checkd")) {
    printf("CHECK DIR\n");
} else if (!strcmp(expression, "checkr")) {
    printf("READ\n");
} else if (!strcmp(expression, "checkw")) {
    printf("CHECK WRITE\n");
} else if (!strcmp(expression, "checkx")) {
    printf("CHECK EX\n");
} else {
    printf("NOOOO\n");
}
}

但是,如果我将其更改为类似下面的内容,我会收到错误消息。似乎在sscanf电话中失败了。但是当我不添加一些变量时,这是有效的。

void condition(char *command) {
int flag;
printf("CAMMAND: %s\n", command);
char *cond;
char *expression;
char *file;
char *buffer;
buffer = malloc(200 * sizeof(char));

sscanf(command, "%s ( %s %s ) %[^\n]", cond, expression, file, buffer);

printf("COND: %s\n", cond);
printf("EX: %s\n", expression);
printf("File: %s\n", file);
printf("Command: %s\n", buffer);

if (!strcmp(expression, "checke")) {
    printf("CHECK EXISTS\n");
    if (file_exists(file)) {
        printf("EXISTS\n");
    }
} else if (!strcmp(expression, "checkd")) {
    printf("CHECK DIR\n");
} else if (!strcmp(expression, "checkr")) {
    printf("READ\n");
} else if (!strcmp(expression, "checkw")) {
    printf("CHECK WRITE\n");
} else if (!strcmp(expression, "checkx")) {
    printf("CHECK EX\n");
} else {
    printf("NOOOO\n");
}
}

似乎无法弄清楚为什么会这样。任何帮助都会很棒!

1 个答案:

答案 0 :(得分:2)

您正在获取内存损坏,因为您将指向字符的指针(而不是指向字符数组的指针)作为%s转换的目标。如定义的那样,expression未初始化并指向一些随机存储位置。以下是sscanf文档的相关部分:

s      Matches a  sequence  of  non-white-space  characters;  the  next
       pointer must be a pointer to character array that is long enough
       to hold the input sequence and the  terminating  null  character

您需要为expression等分配一些空间。