1

我有一个 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++中做什么?

我试过了memcpystrcpystrcpy_s没有运气

4

5 回答 5

9

您不应该修改常量数组!
修改固有的常量对象/变量会导致未定义的行为
只是不要这样做。制作它的副本并修改该副本,或者如果您想修改同一个数组,只需不要将其声明为const.

于 2013-01-17T14:49:00.907 回答
3
  1. 不要修改常量字符串。
  2. const char example[] = "\x4D\x5A\xE8\x00\x00\x00\x00\x5B\x52\x45\x55\x89\xE5\x81\xC3";在这里,您的字符串有几个 NULL 字符串终止符。这不适用于<string.h>(例如 strlen() 和其他)中的函数
  3. 而是使用memcpy,memset函数仅在知道二进制字符串的长度后追加。
  4. 将您的结果存储在字符数组中,但不要因为您的数据而假设它会作为常规字符串工作。
于 2013-01-17T14:55:50.280 回答
2

你的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));
于 2013-01-17T14:51:00.897 回答
0

你永远不应该修改一个常量,包括一个常量数组。如果您想更改上面的内容,请创建它的副本并更改副本。正如 RasmusKaj 指出的那样,strcpy 在这里对您没有帮助,因为源字符串包含零个字符,因此可以使用 memcpy 来创建副本。

于 2013-01-17T14:50:38.993 回答
0

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 与您不想在实例化后修改的任何变量一起使用。

于 2013-01-17T15:20:32.313 回答