为什么我得到的分段错误的限制小于169?

马里乌斯·波普(Marius Pop)

下面的程序应该计算C文件中的单词数。如果我定义MAXWORD为小于169,则会出现细分错误。我发现这很令人困惑,因为我在main内部声明的“ word”字符串中从未使用超过8个字符。不确定下一步要看什么或在哪里看,因此任何指针(无双关语)将不胜感激。

我用它编译后,gcc wc.c getword.c -o wc运行时./wc < wc.c会出现分段错误,但仅当设置MAXWORD小于169时才会出现

这是wc.c文件

#include "getword.h"
#include <stdlib.h>

#define MAXWORD 169

struct tnode {
    char *word;
    int count;
    struct tnode *left;
    struct tnode *right;
};

struct tnode *addtree(struct tnode *, char *);
void printtree(struct tnode *);

int main(void) {
    char word[MAXWORD];
    struct tnode *root;

    while (getword(word, MAXWORD) != EOF) {
        printf("word: %s\n", word);
        if (isalpha(word[0]))
            root = addtree(root, word);
    }
    printtree(root);

    return 0;
}

struct tnode *talloc(void);

struct tnode *addtree(struct tnode *p, char *word) {
    int cond;

    if (p == NULL) {
        p = talloc();
        p->word = strdup(word);
        p->count = 1;
        p->left = p->right = NULL;
    } else if ((cond = strcmp(word,  p->word)) == 0)
        p->count++;
    else if (cond < 0)
        p->left = addtree(p->left, word);
    else
        p->right = addtree(p->right, word);
    return p;
}

struct tnode *talloc(void) {
    return (struct tnode *) malloc(sizeof(struct tnode));
}

void printtree(struct tnode *p) {
    if (p != NULL) {
        printtree(p->left);
        printf("%4d %s\n", p->count, p->word);
        printtree(p->right);
    }
}

这是getword.c文件:

#include "getword.h"

#define STACKMAX 100

void skip_quote(char c);
void skip_comment(char c);
void skip_line(void);

int getch(void);
void ungetch(int);

int getword(char *word, int lim) {
    int c;
    char *w = word;

    while (isspace(c = getch()))
        ;
    if (c != EOF)
        *w++ = c;
    if (c == '#') {
        skip_line();
        return c;
    }
    if (c == '"' || c == '\'') {
        skip_quote(c);
        return c;
    }
    if (c == '/' && ((c = getch()) == '*' || c == '/')) {
        skip_comment(c);
        return c;
    }

    if (!isalpha(c)) {
        *w = '\0';
        return c;
    }

    for ( ; --lim > 0; w++)
        if (!isalnum(*w = getch()) && *w != '_') {
            ungetch(*w);
            break;
        }
    *w = '\0';
    return word[0];
}

void skip_quote(char type) {
    int prev, current;

    prev = type;
    current = '\0';
    while ((prev == '\\' || current != type) && prev != current) {
        prev = current;
        current = getch();
    }
}

void skip_comment(char c) {
    int prev;

    prev = '\0';
    if (c == '/')
        skip_line();
    else if (c == '*')
        while (prev != '*' && (c = getch()) != '/')
            prev = c;
}

void skip_line(void) {
    while (getch() != '\n')
        ;
}

int cstack[STACKMAX];
int sp = 0;

int getch(void) {
    return (sp > 0) ? cstack[--sp] : getchar();
}

void ungetch(int c) {
    if (sp < STACKMAX)
        cstack[sp++] = c;
    else
        printf("error: stack is full\n");
}

这是头文件getword.h头文件

#include <stdio.h>
#include <ctype.h>
#include <string.h>

int getword(char *, int);

为什么我在这里遇到细分错误?

迈克猫

通过使用函数中具有自动存储持续时间(不确定)的未初始化变量的值来调用未定义行为尝试在使用之前对其进行初始化,例如:rootmain()

struct tnode *root = NULL;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章