我写了这个函数来返回包含来自任何文件(使用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);
然而,当从has_checksum(argv[2]);
致电int main()
时,我得到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)
我测试char *f_name
中的get_file_data()
每次都是相同的(在输入printf("%s\n", f_name);
时立即使用get_file_data()
),而且确实如此。
系统
- VM Ubuntu 17.04(64位) - VirtualBox
答案 0 :(得分:0)
你在两种情况下都传递了一个未初始化的指针,但你在$
中得到了“幸运”,它似乎有效。您需要传递实际整数的地址:
main()
你看,当你宣布luint len;
uchar *dat = get_file_data(argv[2], &len);
时,你已经宣布了一个指针,但没有指向它。它包含一个未初始化的值,可能指向任何位置。您可能会也可能无法写入该位置。