实用细分核心倾销

时间:2017-05-22 13:19:22

标签: c

我知道论证的冗余。因此,我想提前感谢你们的耐心等待。

我仔细阅读了很多关于thisthis等问题的好主题。我从概念上清楚了解核心转储是什么,但我无法弄清楚实际是什么以及如何检测它。

请考虑以下我正在处理的示例:它是一个简单的程序,用于检查输入字符串是否为回文:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 20

int length(char s[SIZE]){
        int i;
        while(s[i] != 0)
                i++;
        return i;
}

int main(){
        char s[SIZE], c;
        int i = 0, j, flag = 1;
        printf("\n\nGood morning, master. Tell me a word. I will check if it is a\n"
                "palindrome\n\n");
        for(i = 0; (c = getchar()) != '\n'; ++i){
                s[i] = c;
        }
        j = length(s) - 1;
        while(flag && i < j){
                flag = s[i] == s[j];
                i++; j--;
        }
        if(flag)
                printf("\n\nSuccess!\n\n");
        return 0;
}

这个程序的原因是什么导致崩溃的核心?&#34;

2 个答案:

答案 0 :(得分:2)

你的长度函数有3个大问题:

  1. 本地i未初始化为
  2. 该函数必须在最后返回i值。
  3. 您必须检查以访问您的s数组入站
  4. int length(char s[SIZE]){
            int i = 0;
            while ((s[i] != 0) && (i<size-1))
                    i++;
        return i;
    }
    

    你必须在你的&#34;角色收集循环中照顾s长度&#34;太。你必须注意EOF(可以由getchar返回,例如在Linux上使用 CTRL + D ),你必须终止你的字符串。 C-Stringsnul-terminated

    for (i = 0; (((c = getchar()) != '\n') && (c!=EOF)&& (i<SIZE-2)); ++i)
    {
        s[i] = c;
    }
    s[i] = '\0';
    

    最后注意你的最终循环不是你猜的,只有在输入字符串中有2个相同的字符时才返回...

答案 1 :(得分:1)

您尚未在长度函数中初始化i,因此其值可以是任何

如果其值大于SIZE,您将最终访问无效内存,从而导致段错误