簡體   English   中英

由於strncpy而檢測到堆棧崩潰

[英]stack smashing detected because of strncpy

我的交流程序有問題。 我制作了一個函數,可以對文本文件中的變量進行標記化,並將它們保存為inot集。 問題是來自string.h的strncpy函數在我的程序中表現得很奇怪。 我將代碼分解為最少的示例:

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

void tokenizeWord(int *i, char *text);

int main() {
    char *text = "hallo 123 test foo bar etc";
    int i;
    for (i = 0; i < 24; i++) {
        switch(text[i]){
            case ' ':
                i++;
            default:
                tokenizeWord(&i, text);

        }
    }
    return 0;
}

void tokenizeWord(int *i, char *text) {
    bool eow = false;
    int start = *i;
    int end = start;
    if (i != NULL) {
        while (*i < strlen(text) && !eow)  {
            switch(text[*i]) {
                case ' ':
                    end = (*i);
                    eow = true;
                    break;
                default:
                    (*i)++;
                    break;
            }
        }
        char out[8] = "";
        strncpy(out, text+start, end);
        out[end-start] = '\0';
        printf("%s\n", out);
    }
}

打印出來的第一個變量是“你好”,這是完全正確的行為。 secound變量已經包含“ 123測試”。 但是因為我將\\ 0設置為123之后,其余的將不會被打印。 打印后,我立即發現*堆棧粉碎*中止。 我認為問題是,strncpy函數嘗試寫入8個以上的字符,但是我告訴該函數從位置6到9的文本進行打印。那么為什么strncpy嘗試復制3個以上的字符?

我沒有太多的C編程經驗,並且嘗試了很多事情,例如調試和打印輸出以查找問題,但是我還沒有任何線索。 我希望有人能幫助我。

改變以下

strncpy(out, text+start, end);

strncpy(out, text+start, end-start); 

如果start = 6並且end = 9,那么您將復制9個字節而不是3個字節。

閱讀有關堆棧粉碎的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM