我对 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/