我有一个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
没有运气
答案 0 :(得分:9)
你不应该修改常数数组!
修改固有的常量对象/变量会导致未定义的行为
只是不要这样做。制作它的副本并修改该副本,或者如果要修改同一个数组,则不要将其声明为const
。
答案 1 :(得分:3)
const char example[] = "\x4D\x5A\xE8\x00\x00\x00\x00\x5B\x52\x45\x55\x89\xE5\x81\xC3";
在这里,你的字符串有一些NULL字符串终结符。这不适用于<string.h>
中的函数(例如strlen()和其他函数)memcpy
,memset
函数进行追加。 答案 2 :(得分:2)
您的example[]
字符数组定义为const
,因此您无法对其进行修改。
1)如果以这种方式更改const char数组,你应该在编译中得到一个错误
example[2] ='R';
2)如果通过memcpy
或strcpy
将其更改为
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与任何您不希望在实例化后修改的变量一起使用。