如果被其他函数使用,读取二进制文件的 C 函数不起作用。?
C function to read binary file doesn't work if used by other function.?
我把这个函数写到 return 一个 unsigned char *
包含来自任何文件的数据(使用 rb
读取模式)它看起来像这样:
uchar * get_file_data (char *f_name, luint *len) {
// verify file
struct stat sBuffer;
int iRc;
iRc = stat(f_name, &sBuffer);
if (iRc != 0) {
printf("Failed to get file size\n");
exit(3);
}
// read file
FILE *fp;
fp = fopen(f_name, "rb");
if (fp == NULL) {
printf("Failed to open file\n");
exit(3);
}
uchar *buff = (uchar *) malloc(sBuffer.st_size);
*len = fread(buff, 1, sBuffer.st_size, fp);
fclose(fp);
return buff;
}
类型:
typedef unsigned char uchar;
typedef unsigned long int luint;
现在这在 int main()
函数中的 运行 时有效,如下所示:
luint *len;
uchar *dat = get_file_data(argv[2] /* argument congaing filename */, len);
print_uchar(dat, len);
free(dat);
然而,当从 int main()
调用 has_checksum(argv[2]);
时,我得到一个 Segmentation fault (core dumped)
,尽管使用看起来是一样的。
int has_checksum (char *f_name) {
luint *p_len;
uchar *p_f_data = get_file_data(f_name, p_len); /* this fails */
/* more code, never reached */
}
当我尝试 运行使用以下 main()
设置我的程序时:
int main(int argc, char **argv) {
// verifying other arguments (not filename) */
luint *len;
uchar *dat = get_file_data(argv[2], len);
print_uchar(dat, len);
free(dat);
has_checksum(argv[2]);
return 0;
}
我得到这个输出:
$ ./md5 -add ../<filename>
<file contents (correct)>
Segmentation fault (core dumped)
我测试了get_file_data()
中的char *f_name
是否每次都相同(输入get_file_data()
时立即使用printf("%s\n", f_name);
),是。
系统:
-- 虚拟机 Ubuntu 17.04(64 位)-- VirtualBox
您在这两种情况下都传递了一个未初始化的指针,但您在 main()
中得到了 "lucky" 并且它似乎有效。您需要传递一个实际整数的地址:
luint len;
uchar *dat = get_file_data(argv[2], &len);
你看,当你声明 luint *len;
时,你已经声明了一个指针,但没有任何东西可以指向。它包含一个未初始化的值,可以指向任何地方。您可能无法写入该位置。
我把这个函数写到 return 一个 unsigned char *
包含来自任何文件的数据(使用 rb
读取模式)它看起来像这样:
uchar * get_file_data (char *f_name, luint *len) {
// verify file
struct stat sBuffer;
int iRc;
iRc = stat(f_name, &sBuffer);
if (iRc != 0) {
printf("Failed to get file size\n");
exit(3);
}
// read file
FILE *fp;
fp = fopen(f_name, "rb");
if (fp == NULL) {
printf("Failed to open file\n");
exit(3);
}
uchar *buff = (uchar *) malloc(sBuffer.st_size);
*len = fread(buff, 1, sBuffer.st_size, fp);
fclose(fp);
return buff;
}
类型:
typedef unsigned char uchar;
typedef unsigned long int luint;
现在这在 int main()
函数中的 运行 时有效,如下所示:
luint *len;
uchar *dat = get_file_data(argv[2] /* argument congaing filename */, len);
print_uchar(dat, len);
free(dat);
然而,当从 int main()
调用 has_checksum(argv[2]);
时,我得到一个 Segmentation fault (core dumped)
,尽管使用看起来是一样的。
int has_checksum (char *f_name) {
luint *p_len;
uchar *p_f_data = get_file_data(f_name, p_len); /* this fails */
/* more code, never reached */
}
当我尝试 运行使用以下 main()
设置我的程序时:
int main(int argc, char **argv) {
// verifying other arguments (not filename) */
luint *len;
uchar *dat = get_file_data(argv[2], len);
print_uchar(dat, len);
free(dat);
has_checksum(argv[2]);
return 0;
}
我得到这个输出:
$ ./md5 -add ../<filename>
<file contents (correct)>
Segmentation fault (core dumped)
我测试了get_file_data()
中的char *f_name
是否每次都相同(输入get_file_data()
时立即使用printf("%s\n", f_name);
),是。
系统:
-- 虚拟机 Ubuntu 17.04(64 位)-- VirtualBox
您在这两种情况下都传递了一个未初始化的指针,但您在 main()
中得到了 "lucky" 并且它似乎有效。您需要传递一个实际整数的地址:
luint len;
uchar *dat = get_file_data(argv[2], &len);
你看,当你声明 luint *len;
时,你已经声明了一个指针,但没有任何东西可以指向。它包含一个未初始化的值,可以指向任何地方。您可能无法写入该位置。