C ++更改const char中的值

时间:2013-01-17 14:47:52

标签: c++ pointers

我有一个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没有运气

5 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分: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. 在知道二进制字符串的长度后,仅使用memcpymemset函数进行追加。
  4. 将结果存储在字符数组中,但不要认为它会因为您的数据而作为常规字符串工作。

答案 2 :(得分:2)

您的example[]字符数组定义为const,因此您无法对其进行修改。

1)如果以这种方式更改const char数组,你应该在编译中得到一个错误

example[2] ='R';

2)如果通过memcpystrcpy

修改const char数组,则会收到警告

将其更改为

char example[] = "\x4D\x5A\xE8\x00\x00\x00\x00\x5B\x52\x45\x55\x89\xE5\x81\xC3";

并且您无法使用strcpy,因为您的字符数组中间包含x00,因此这会影响strcpy函数。因为strcpy在char数组中找到x00时会停止

example[] char数组中间包含x00,因此要查找example[] 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));

答案 3 :(得分:0)

永远不要修改包含常量数组的常量。如果您想要更改上面的内容,请创建一份副本并更改副本。正如RasmusKaj所指出的,strcpy在这里不会帮助你,因为源字符串包含零字符,所以也许可以使用memcpy来创建副本。

答案 4 :(得分:0)

无法更改Const变量。这是设计的。对于c字符串,您可以拥有字符串const的内容或指向字符串const的指针。

由于您将其定义为const字符数组,因此指针显式为const,内容显式为const。

const char * const mystring = "hello"

在这种情况下,第一个“const”尝试应用left(没有任何内容),因此它适用于(对于char类型)。所以字符串内容可能不会改变。第二个const尝试应用left,因此它使指针本身为const。这意味着mystring指针必须始终指向内存中“hello”的“h”。

所以之后如果我尝试:

mystring[0] = "y"

mystring = "gooodbye!"

他们不会工作。如果你分别删除了第一个或第二个const,它们就可以工作了。

const的目的是让你提前说“这个变量不能修改”。这意味着,如果它被修改,那么就会出现问题。通常,您应该始终将const与任何您不希望在实例化后修改的变量一起使用。