我是一个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;
}
然而,甚至在main函数的print语句之前,存在分段错误,并且代码无法进一步编译。
这应该是使用UNIX命令行输入编译的,我不熟悉,可能是错误的原因,除此之外,谷歌告诉我,这可能是内存分配错误,我还没有了解到这一点。我在想的另一种可能性可能是我用来改成十六进制的sprintf。如果任何人以前遇到过这种情况或有任何想法的原因可能是任何援助将不胜感激。
3条答案
按热度按时间quhf5bfb1#
最可能的错误原因是尝试使用
sprintf
打印到NULL
缓冲区。此缓冲区的内存不是由
sprintf
分配的。您需要为null终止符留出空间,因此可以指定一个char数组,其中包含8个char
值,这将轻松处理您想要保存的值:正如注解中所指出的,构造值的字符串表示,然后将该字符串打印到标准输出是不必要的。
plupiseo2#
你几乎肯定不会在“主函数的任何部分运行之前”得到分段错误。分段错误发生在稍后,但由于缓冲,你看不到任何来自
printf
的输出。printf
并不总是将数据写入输出流。相反,printf
将数据存储在内部缓冲区中,并且仅偶尔写入该数据。何时可以发生写入的细节对于这个问题并不特别重要,但原因应该是理解的。写入数据可能是昂贵的,所以标准库实现推迟写入,直到有足够的数据可用,使其值得。有3个标准缓冲模式:全缓冲(又名块缓冲)、行缓冲和非缓冲。如果流是非缓冲的,则printf
将始终写入数据。如果流是行缓冲的,则printf
将在向缓冲区添加整行时写入数据。对于块缓冲,printf
将延迟写入,直到完成数据块(例如4096字节)可用。您可以通过在流上调用fflush
来触发写操作。因此,如果您想确保看到文本,可以执行以下操作:通常,当程序退出时,缓冲区被刷新,但如果程序异常终止,则并不总是发生这种情况。分段错误会导致异常终止,并且缓冲区不会被刷新。
注意,如果流是行缓冲的,你可能会使用
printf("test words\n")
或puts("test words")
而不是显式调用fflush
。一位评论者认为这是足够的,因为“stdout是面向行的”,但这并不总是正确的。stdout
通常是行缓冲的,但并不总是如此。如果你想确保数据被写入,显式的fflush
是明智的。ruarlubt3#
这演示了一种实现你需要的东西的方法。它没有涵盖你编码的所有东西,但涵盖了你定义的目标的基础。希望它足以帮助回答你的问题。祝你好运。