c - 实用分段核心转储

标签 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;
}

是什么导致了这个程序中的“核心碰撞”?

最佳答案

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

  1. 本地 i 没有初始化为
  2. 函数必须在最后返回 i 值。
  3. 您必须检查以在边界内访问您的 s 数组

int length(char s[SIZE]){
        int i = 0;
        while ((s[i] != 0) && (i<size-1))
                i++;
    return i;
}

您还必须注意“字符收集循环”中的s 长度。您必须注意 EOF(可以由 getchar 返回,例如在 Linux 上使用 CTRL + D)并且您必须终止字符串。 C 字符串nul 终止的

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

最后请注意,您的最终循环并不像您猜测的那样,仅当输入字符串中有 2 个相同的字符时才返回...

关于c - 实用分段核心转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44113981/

相关文章:

c - mktime 返回错误的时间戳(关闭整整一个月)

c - 如何使用 C 只删除 ASCII 文本文件的最后一行?

c - 如何在结构体中使用指针?

c - C 中的分号和逗号

c - 如何获取内存类型?

c - 如何在循环中组合 RECV 和 getMessage(C、WINAPI)

c - 以 super 用户身份运行时信号量工作,否则无法工作

尝试分配数组时 C 无法比较的类型

c - C语言宏定义中的斜杠是什么意思?

c - 如何重置驱动程序读取函数:myread(struct file *file, char __user *buf,size_t len, loff_t *fops)中的缓冲区(初始化为零)?