簡體   English   中英

在 C 中檢測到堆棧崩潰 - 為什么會發生這種情況?

[英]Stack smashing detected in C - why does this happen?

我有以下 function,給定一個字符串,它應該在其中找到最常見的幾個字母並將結果存儲在不同的字符串中。 例如 - 對於字符串“ababa”,最常見的一對是“ba”,而對於“excxexd”,它將是“ex”。 這是代碼:

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

void printError(){
    printf("Error: please check your input\n");
}

bool isLexicographicallyPreceding(char couple1[], char couple2[])
{
    if (strcmp(couple1, couple2)>=0) return true;
    return false;
}

void coupleDetector(int length, char word[], char result[])
{
    char couples[length-1][2];
    for (int i=0; i<length-1; i++)
    {
        char couple[2] = {word[i], word[i+1]};
        strcpy(couples[i], couple);
    }
    char element[]="";
    int count=0;
    for (int j=0; j<length-1; j++)
    {
        char tempElement[2];
        strcpy(tempElement,couples[j]);
        int tempCount=0;
        for (int p=0; p<length-1; p++)
        {
            if (couples[p]==tempElement) tempCount++;
        }
         if (tempCount>count)
            {
                strcpy(element, tempElement);
                count=tempCount;
            }
            if (tempCount==count)
            {
                if (isLexicographicallyPreceding(tempElement,element) == true) strcpy(element, tempElement);
            }
    }
    strcpy(result,element);
}

int main() {
    //Supposed to print "ba" but instead presents "stack smashing detected".
    int length=5;
    char arr[] = "ababa";
    char mostCommonCouple[2];
    coupleDetector(length,arr,mostCommonCouple);
printf("%s", mostCommonCouple);
    return 0;
}

代碼編譯沒有錯誤,但由於某種原因沒有按預期工作,而是打印出“檢測到堆棧粉碎”。 為什么會這樣? 建議會很有幫助。 謝謝。

在試用您的程序時,我發現您的一些角色 arrays 尺寸過小。 字符 arrays(字符串)的大小需要足夠大,以便在數組中也包含 null 終止符值。 因此,在許多位置,具有兩個字符的數組大小是不夠的,並且是堆棧崩潰的原因。 考慮到這一點,以下是您程序的重構版本。

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

void printError()
{
    printf("Error: please check your input\n");
}

bool isLexicographicallyPreceding(char couple1[], char couple2[])
{
    if (strcmp(couple1, couple2)>=0) return true;
    return false;
}

void coupleDetector(int length, char word[], char result[])
{
    char couples[length-1][3];
    for (int i=0; i<length-1; i++)
    {
        char couple[3] = {word[i], word[i+1], '\0'};
        strcpy(couples[i], couple);
    }
    char element[3];        /* Define the character array */
    strcpy(element, "");    /* Then initialize it if need be */
    int count=0;
    for (int j=0; j<length-1; j++)
    {
        char tempElement[3];
        strcpy(tempElement,couples[j]);
        int tempCount=0;
        for (int p=0; p<length-1; p++)
        {
            if (couples[p]==tempElement) tempCount++;
        }
        if (tempCount>count)
        {
            strcpy(element, tempElement);
            count=tempCount;
        }
        if (tempCount==count)
        {
            if (isLexicographicallyPreceding(tempElement,element)) strcpy(element, tempElement);
        }
    }
    strcpy(result,element);
}

int main()
{
    //Supposed to print "ba" but instead presents "stack smashing detected".
    int length=5;
    char arr[] = "ababa";
    char mostCommonCouple[3];                   /* Notice size requirement to also contain the '\0' terminator */
    coupleDetector(length,arr,mostCommonCouple);
    printf("%s\n", mostCommonCouple);
    return 0;
}

以下是一些要點。

  • 查看代碼,arrays 的大多數大小都放大了一個以容納 null 終止符的存儲。
  • “元素”等工作字段需要定義為適當的大小,以便后續使用不會導致堆棧崩潰。

測試重構代碼會產生以下終端 output。

@Vera:~/C_Programs/Console/Recurrent/bin/Release$ ./Recurrent 
ba

因此,重申一下,要認識到通常需要將字符 arrays 定義為足夠大,以包含最大的預期字符串加上一個 null 終止符。

試一試,看看它是否符合您項目的精神。

暫無
暫無

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

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