c - 是什么导致 C 中出现段错误(核心转储)?

标签 c segmentation-fault coredump hamming-code

我正在尝试用 C 编写汉明代码程序。但是,在编译后尝试运行 ./a.out 时,我不断收到段错误(核心转储)错误。它编译时没有错误,我知道在尝试寻址已释放的空间或修改字符串文字时可能会发生此错误。我不相信我正在做这两件事,我只是有一个简单的矩阵,我正在填写和交叉检查。对这个问题的任何见解都将不胜感激,我在下面留下了迄今为止的代码:

这是一个家庭作业问题,涉及创建一个汉明代码程序来处理 data.dat 输入和输出到一个文件 1 和 0 的排序列表

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

FILE *fp;
FILE *fpOut;

int main(int argc, char *argv[])
{
        fp = fopen(argv[1], "r");
        fpOut = fopen("sortedCodeWords.dat", "w");

        int temp;
        int numI = 0;
        int count = 0;

        char matrix1[7];

        if(fp == NULL)
                printf("File can not be opened");
        else
        {
                char ch = getc(fp);

                while(ch != EOF)
                {

                        matrix1[2] = ch;
                        ch = getc(fp);

                        matrix1[4] = ch;
                        ch = getc(fp);

                        matrix1[5] = ch;
                        ch = getc(fp);

                        matrix1[6] = ch;
                        ch = getc(fp);

                        ch = getc(fp);

                        if(ch == '\n')
                        {
                                for(int i = 2; i < 7; i++)
                                {
                                        if(matrix1[i] == '1')
                                            numI++;

                                        i++;
                                }

                                if(numI % 2 == 0)
                                        matrix1[0] = 0;
                                else
                                        matrix1[0] = 1;

                                numI = 0;

                                for(int i = 1; i < 7; i++)
                                {
                                        if(matrix1[i] == '1')
                                                numI++;
                                        if(matrix1[i+1] == '1')
                                                numI++;

                                        i++;
                                        i++;
                                }

                                if(numI % 2 == 0)
                                        matrix1[1] = 0;
                                else
                                        matrix1[1] = 1;

                                numI = 0;

                                for(int i = 4; i < 7; i++)
                                {
                                        if(matrix1[i] == '1')
                                                numI++;
                                }

                                if(numI % 2 == 0)
                                        matrix1[3] = 0;
                                else
                                        matrix1[3] = 1;
                                numI = 0;

                                for (int i = 0; i < 7; i++)
                                {
                                        fprintf(fpOut, "%s", matrix1[i]);
                                }

                                fprintf(fpOut, "\n");

                                ch = getc(fp);
                        }

                        count++;
                }
        }
}


我希望输出到文件。我并不总是收到此错误,但是当我从 2D 数组更改为 1D 数组时,我现在收到此错误(我更改是因为我意识到没有必要)

最佳答案

我还没有编译它,但我注意到的一件事是它看起来好像你可能会离开你正在循环到 i<7 的数组的末尾。但使用索引 i+1在一种情况下。

也许在启用 AddressSanitizer 的情况下进行构建,并查看在检查上述潜在问题后会收到哪些运行时警告。 (应该只是将以下标志添加到 gcc 命令中...
-g -fsanitize=地址 -fno-omit-frame-pointer

关于c - 是什么导致 C 中出现段错误(核心转储)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55601903/

相关文章:

c++ - 指针到指针、指向值地址和二维数组访问之间的清晰度

c++ - 段错误 : "...no such file or directory"

c - 分段故障

mongodb - 无法运行 mongodb 因为核心转储问题?

c - 在 MS Windows 资源管理器中隐藏可移动驱动器?

Java 类到 C 结构

c - 为什么 Valgrind memcheck 不捕获这个 UB?

c - 段错误 - 原因是什么

java - 当IBM-JDK中jvm处于 Activity 状态时如何生成核心转储文件

c++ - 崩溃后内存映射中是否有任何有用的信息