【发布时间】:2021-08-09 21:31:47
【问题描述】:
我试图将二进制文件读入动态字符串,但出现了问题。 我无法释放字符串,也无法打印或用它做任何其他事情。 如果我在没有运行良好的所有动态内容的情况下打开它,文件就可以了。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning (disable: 4996)
#define STR_LEN 50
int main(int args, char** argv)
{
char filePath[STR_LEN];
char signaturePath[STR_LEN];
FILE* file;
FILE* signature;
int fileSize;
int signatureSize;
strcpy(filePath, argv[2]);
strcpy(signaturePath, argv[1]);
file = fopen(filePath, "rb");
signature = fopen(signaturePath, "rb");
if (file == NULL)
printf("e: f\n");
if (signature == NULL)
printf("e: s\n");
fseek(file, 0L, SEEK_END);
fileSize = ftell(file);
fseek(file, 0L, SEEK_SET);
fseek(signature, 0L, SEEK_END);
signatureSize = ftell(signature);
fseek(signature, 0L, SEEK_SET);
char* fileStr = (char)malloc(sizeof(char) * fileSize + 1);
char* signatureStr = (char)malloc(sizeof(char) * signatureSize + 1);
fread(fileStr, fileSize, 1, file);
fread(signatureStr, signatureSize, 1, signature);
free(fileStr);
free(signatureStr);
fclose(file);
fclose(signature);
return 0;
}
【问题讨论】:
-
正如一点,在您使用
args.检查元素的有效性之前,永远访问argv[]除非人们证明这一点,否则我不会相信他们提供了任何论据. -
另外一点:不要将
filePath和signaturePath声明为数组。不需要复制argv[1]和argv[2]指向的字符串。只需将路径变量声明为const char *并让它们指向与argv[1]和argv[2]相同的字符串。这样您就不会被限制为 49 个字符长的路径名,而且您不必担心复杂的代码来防止缓冲区溢出。 -
谢谢。很有帮助。