我有一个 const char
const char example[] = "\x4D\x5A\xE8\x00\x00\x00\x00\x5B\x52\x45\x55\x89\xE5\x81\xC3";
和
DWORD* example2 = "\xAA\xBB\xCC\xDD";
我想用example2上的那些改变example1的最后4个字节我可以在C++中做什么?
我试过了memcpy
,strcpy
但strcpy_s
没有运气
您不应该修改常量数组!
修改固有的常量对象/变量会导致未定义的行为。
只是不要这样做。制作它的副本并修改该副本,或者如果您想修改同一个数组,只需不要将其声明为const
.
const char example[] = "\x4D\x5A\xE8\x00\x00\x00\x00\x5B\x52\x45\x55\x89\xE5\x81\xC3";
在这里,您的字符串有几个 NULL 字符串终止符。这不适用于<string.h>
(例如 strlen() 和其他)中的函数memcpy
,memset
函数仅在知道二进制字符串的长度后追加。你的example[]
char 数组被定义为const
你不能修改它。
1)如果您以这种方式更改 const char 数组,您应该会在编译中出错
example[2] ='R';
2)如果您通过memcpy
或通过修改您的 const char 数组,您应该会收到警告strcpy
将其更改为
char example[] = "\x4D\x5A\xE8\x00\x00\x00\x00\x5B\x52\x45\x55\x89\xE5\x81\xC3";
而且你不能使用strcpy
,因为你的字符数组包含x00
在中间所以这会影响strcpy
功能。因为在 char 数组中strcpy
找到时停止x00
example[]
char 数组包含x00
在中间,因此查找example[]
with的长度strlen
将无法正常工作。对于这种情况,我建议sizeof(example)
改用。
下面介绍如何制作副本:
char example[] = "\x4D\x5A\xE8\x00\x00\x00\x00\x5B\x52\x45\x55\x89\xE5\x81\xC3";
DWORD* example2 = "\xAA\xBB\xCC\xDD";
if (sizeof(example)>=sizeof(example2))
memcpy(example+sizeof(example)-sizeof(example2), example2, sizeof(example2));
你永远不应该修改一个常量,包括一个常量数组。如果您想更改上面的内容,请创建它的副本并更改副本。正如 RasmusKaj 指出的那样,strcpy 在这里对您没有帮助,因为源字符串包含零个字符,因此可以使用 memcpy 来创建副本。
const 变量不能更改。这是设计使然。对于 ac 字符串,您可以拥有字符串 const 的内容或指向字符串 const 的指针。
由于您将其定义为 const 字符数组,因此指针隐式为 const,而内容显式为 const。
const char * const mystring = "hello"
在这种情况下,第一个“const”尝试向左应用(什么都没有),所以它向右应用(对 char 类型)。所以字符串内容可能不会改变。第二个 const 尝试向左应用,因此它使指针本身为 const。这意味着 mystring 指针必须始终指向内存中“hello”中的“h”所在的位置。
所以之后如果我尝试:
mystring[0] = "y"
或者
mystring = "gooodbye!"
他们不会工作。如果您分别删除了第一个或第二个 const,它们可以工作。
const 的目的是让你提前说“这个变量不能被修改”。这意味着,如果它被修改,那么就会有问题。通常,您应该始终将 const 与您不想在实例化后修改的任何变量一起使用。