为什么__stack_chk_fail在我的代码中发生?

San*_*hao 6 c macos

关于以下功能,完成此功能后,调试器会向我显示__stack_chk_fail。

我的系统是Mac OS。

这是因为我的堆栈通过检查引用而自身溢出。

同样基于我的实验,如果设置vocab_size = 30000,则显示__stack_chk_fail错误,但是当vocab_size = 20000时,则可以。

所以我相信

vocab = (struct vocab_word *)malloc ((size_t) ((vocab_size + 1) * sizeof(struct vocab_word)));
Run Code Online (Sandbox Code Playgroud)

是问题。但是malloc在堆而不是堆栈上分配内存,所以我想知道哪里出错了?

void populate_vocab(){
    FILE *fin;
    fin = fopen(word_file, "rb");
    vocab = (struct vocab_word *)malloc ((size_t) ((vocab_size + 1) * sizeof(struct vocab_word)));
    char word[MAX_STRING];
    int word_idx = 0;
    int num = 0;
    boolean word_mode = 1;
    long long cur_vocab_size = 0;

    while (!feof(fin)) {
        ch = fgetc(fin);

        if(ch == ' '){
            word_mode = 0;
        }else if(ch == '\n'){
            word_mode = 1;
            word[word_idx] = 0;
            vocab[cur_vocab_size].word = (char *)calloc(word_idx, sizeof(char));
            strcpy(vocab[cur_vocab_size].word,word);
            vocab[cur_vocab_size].cn = num;
            cur_vocab_size++;
            if (cur_vocab_size >= vocab_size){
                break;
            }
            //fresh var
            word_idx = 0;
            num = 0;

        }else{
            if(word_mode){
                word[word_idx] = ch;
                word_idx ++;
            }else{
                num = num * 10;
                num += ch - '0';
            }
        }
    }
    fclose(fin);
}
Run Code Online (Sandbox Code Playgroud)

San*_*hao 5

根据评论,我找出了原因。单词之一超过MAX_STRING,这会导致堆栈溢出。