【发布时间】:2021-06-05 11:04:46
【问题描述】:
我正在按照this 文章编写标准 C 中的 PE 文件查看器。它非常整洁,但我对第一行有疑问:
#include "stdafx.h"
#include "Windows.h"
#include <iostream>
int main(int argc, char* argv[]) {
const int MAX_FILEPATH = 255;
char fileName[MAX_FILEPATH] = {0};
memcpy_s(&fileName, MAX_FILEPATH, argv[1], MAX_FILEPATH);
...
}
如您所见,作者将 MAX_FILEPATH 定义为 255,但我不能这样做,因为我将给出的输入参数可能比这更大。
我决定使用 malloc 进行动态内存分配,这样我就可以拥有一个自动调整大小的数组(确切的参数长度),并且还可以为我保存 'memcpy_s' 函数:
#include <stdio.h>
#include "Windows.h"
#pragma warning (disable: 6011 6386 6387) // MSVC is giving me a headache.
int main(int argc, char *argv[]) {
int length = strlen(argv[1]); // Yes, I only care for 1 input argument.
char* path = malloc(length * sizeof(char));
int i = 0;
for (; i <= length; i++) {
if (i < length) {
path[i] = argv[1][i];
}
else {
path[i] = '\0';
}
}
...
}
我知道“for cicle”在速度方面可能不是最佳选择,但我对此并不担心。相反,我很担心,因为一切似乎都很好,但是当我到达代码的第二部分(即 HANDLE 的创建)时,它总是返回错误。
HANDLE file = CreateFileA(path, GENERIC_ALL, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (file == INVALID_HANDLE_VALUE) {
printf_s("Nope."); // Always throwing nopes.
}
你知道我做错了什么吗?也许我试图混合不同的数据类型或函数的方式......?
非常感谢,提前。
顺便说一句,如果您对我的 C 编码风格有任何建议,或者如果某些东西不是真正的“C 标准”,请告诉我。
如果有人遇到同样的问题...
尝试以管理员身份运行您的程序...这完全与文件权限有关。
【问题讨论】:
-
将
char* path = malloc(length+1);设为终止空字符。 ` -
只使用
argv[1]有什么问题?例如。char *path= argv[1];?或者干脆忘记path。 -
无论如何,按照正确的
malloc做strcpy。 -
另外,
sizeof(char)在定义上总是一个。如果您使用memcpy_s()是因为 MSVC 说memcpy()已“弃用”,请注意您实际上被骗了。memcpy()没有也不会被任何人弃用 - 它是 standard C 并且不会消失。 MSVC 推动您使用*_s函数,这将是 C 标准附件 K 中的标准函数,但 Microsoft 的实现是非标准且不可移植的。见open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm#impementations -
感谢您的建议;我会修复它们并继续前进:)