gpt4 book ai didi

c - 尝试按字节读取图像字节时出现段错误 11

转载 作者:太空狗 更新时间:2023-10-29 16:10:53 25 4
gpt4 key购买 nike

我正在尝试编写一个简单的 C 代码来计算一个字节在文件中重复的次数。我们用 .txt 文件尝试了代码并产生了奇迹(测试的最大大小:137MB)。但是当我们用一张图片(即使很小,2KB)尝试它时,它返回了Segmentation Fault 11

我做了一些研究并找到了一些特定的图像库,但我不想求助于它们,因为它的代码不仅适用于图像,而且适用于几乎任何类型的文件。有没有一种方法可以简单地按字节读取一个文件字节,而不管其他任何内容(扩展名、元数据等)。

这是代码:

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

int main(int argc, char **argv) {

FILE *f;
char *file;
long numTotalBytes = 0;
int bytesCount[256] = {0};

f = fopen ( argv[1], "rb");
fseek(f, 0L, SEEK_END);
numTotalBytes = ftell(f);
rewind(f);

file = calloc(1, numTotalBytes);
fread(file, numTotalBytes, 1, f);
fclose(f);

printf("numTotalBytes: %ld", numTotalBytes); //<- this gives the right output even for images

unsigned int i;
for (i=0; i<numTotalBytes; ++i) {
unsigned char pointer = file[i]; //<- This access fails at file[1099]
int pointer_int = (int)pointer;
printf("iteration %i with pointer at %i\n", i, pointer_int); //<- pointer_int is never below 0 or above 255
//++bytesCount[(int)file[i]];
++bytesCount[pointer_int];
}

free(file);
}

一些额外的信息:
- 将 img 的扩展名更改为 .txt 不起作用。
- 代码恰好在第 1099 次迭代时返回段错误(我使用的文件大约为 163KB,因此文件 [i] 应该接受最多大约文件 [163000] 的访问)。
- 对于 txt 文件,完美无缺。一个一个地读取字节并按预期计算它们,而不考虑文件大小。
- 我在 Mac 上(你永远不知道...)

//编辑:我已将代码编辑为更加简洁和解释性更好的代码,因为你们中的一些人告诉我我已经尝试过的事情。

//EDIT_2:好的,伙计们,没关系。这个版本应该可以在不是我的任何其他计算机上运行。我认为问题出在传递参数时我的终端,但我只是切换了操作系统并且它可以工作。

最佳答案

  • 检查 fopen()calloc() 是否成功。
  • 打印long 的格式说明符是%ld,而不是%lu
  • (int)file[i] 对数组索引不利,因为将 char 转换为 int 将保留其值,如果所有值都可以表示为 char 可在 int 中表示,并且因为如果 char 在您的环境(和设置)中签名,它可能会访问负索引,导致超出范围的访问并调用未定义的行为

你应该改变 ++bytesCount[(int)file[i]];++bytesCount[(unsigned char)file[i]]; 按顺序以防止使用负索引。

另请注意,ftell()SEEK_END 可能不支持二进制流(N1570 7.21.9.2 fseek 函数),因此最好阅读逐个使用 fgetc() 以避免 undefined behavior并使用更少的内存。

关于c - 尝试按字节读取图像字节时出现段错误 11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37885349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com