c - 为什么在我的主函数的任何部分运行之前我会遇到段错误(核心转储)

标签 c unix error-handling segmentation-fault

我对 C 非常陌生,我已经为一个分配编写了一个相对简单的代码,该代码应该从文件中逐字节获取输入并打印文件的十六进制值表,类似于 -od 命令。我将所有代码移至此处包含的单个文件中。

#include <stdio.h>
#include "dataDump.h"

//
// Created by crsan on 3/23/2023.
//
#include "dataDump.h"
int dataDump(char *fileName) {
    FILE *inFile = fopen(fileName, "r");
    if (inFile == NULL) {
        return -1;
    }
    int whiteSpace = 00000000;
    int line = 0;
    unsigned char c;

    printf("00000000");
    char *hex = NULL;
    for (int i = 0; (c = getc(inFile)) != EOF; i++) {
        sprintf(hex, "%02x", c);
        printf(" %s", hex);
        whiteSpace++;
        line++;
        if (line == 15) {
            printf("\n%08d", whiteSpace);
            line = 0;
        }

    }
    if (line != 0) {
        printf("\n%d", whiteSpace);
    }
    return whiteSpace;
}
int main(int argc, char *argv[]) {
    printf("test words");
    dataDump(argv[1]);
    return 0;
} 

但是,在主函数的 print 语句之前就出现了段错误,并且代码无法进一步编译。

这应该是使用 UNIX 命令行输入进行编译的,我对此不熟悉,可能是错误的原因。除此之外,谷歌告诉我这可能是一个内存分配错误,我还没有了解。我想到的另一种可能性可能是我用来更改为十六进制的 sprintf 。如果有人以前遇到过这种情况或知道原因可能是什么,我们将不胜感激。

最佳答案

最可能导致错误的原因是尝试使用 sprintf 打印到 NULL 缓冲区。

   char *hex = NULL;
   for (int i = 0; (c = getc(inFile)) != EOF; i++) {
       sprintf(hex, "%02x", c);
       printf(" %s", hex);

此缓冲区的内存不是由 sprintf 分配的。您需要为 null 终止符留出空间,因此您可以指定一个 char 数组,其中包含 8 个 char 值,这样可以轻松处理您想要保存的值:

    char hex[8];
    for (int i = 0; (c = getc(inFile)) != EOF; i++) {
        sprintf(hex, "%02x", c);
        printf(" %s", hex);

正如评论中所述,构造值的字符串表示形式,然后将该字符串打印到标准输出是不必要的。

    for (int i = 0; (c = getc(inFile)) != EOF; i++) {
        printf(" %02x", c);

关于c - 为什么在我的主函数的任何部分运行之前我会遇到段错误(核心转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75838123/

相关文章:

php - PHP镜像脚本经常给出错误500内部服务器错误

asp-classic - 基于ASP的网站和表单的错误处理

c - 使用 O_TRUNC 重写文件

c - Windows 在 C 中获取屏幕分辨率

python - 使用 UNIX cSh 运行 python 程序时出错

linux - 如何编写跟随光标的 X11 应用程序

javascript - 获取复杂数组值或null的简单方法

有人能解释一下这个 C 代码片段将如何评估 w.r.t 序列点吗?

c - 如何使用 C 在 GTK Stack Switcher 中使用图像

linux - Unix 天才 - 从一堆文件名中删除 "."?