C字符串向后赋值

C字符串向后赋值,c,C,我有一些反编译的C源代码,看到了这个奇怪的字符串赋值 char v1[21]; v1[0] = 0x75767778; "tsrqponmlkjihgfedcba" = v1; 发生了什么事?这怎么可能 char v1[21]; 到目前为止没有问题;它将v1定义为21个char元素的数组 v1[0] = 0x75767778; 合法,但不正确v1[0]是一个char对象。除非CHAR\u BIT>=32(不太可能),否则它不能保存值0x75767778。如果纯char无符号且char\u位

我有一些反编译的C源代码,看到了这个奇怪的字符串赋值

char v1[21];
v1[0] = 0x75767778;
"tsrqponmlkjihgfedcba" = v1;
发生了什么事?这怎么可能

char v1[21];
到目前为止没有问题;它将
v1
定义为21个
char
元素的数组

v1[0] = 0x75767778;
合法,但不正确
v1[0]
是一个
char
对象。除非
CHAR\u BIT>=32
(不太可能),否则它不能保存值
0x75767778
。如果纯
char
无符号且
char\u位==8
,则它将分配值
0x78
;如果对plain
char
进行签名,则可能会执行相同的操作,但值是由实现定义的

0x75767778
的字节可能是字符
'u'
'v'
'w'
'x'
的ASCII码

"tsrqponmlkjihgfedcba" = v1;
这完全是非法的。字符串文字不能位于赋值的左侧,并且C不支持数组赋值

char v1[21];
v1[0] = 0x75767778;
"tsrqponmlkjihgfedcba" = v1;
显然,您的“反编译器”(您还没有确定)正在生成某种或多或少看起来像C的东西,但实际上不是

如果赋值的左侧和右侧是反向的,则可以部分解释这一点。即使是这样,输出也似乎是某种伪代码。(代码是否实际使用了
=
而不是
->
=>
?)

查看用于“反编译”的源代码会很有帮助——了解您正在使用的“反编译器”并查看其文档也会很有帮助


我的猜测是,源代码有一个字符串文字,如
“xwvutsrqponmlkjihgfedcba”
,生成的代码使用一个整数赋值来复制
“xwvu”
(表示为
0x75767778
),并对剩余的20个字符进行单独的操作,但这只是一个猜测。或者它可能是
“abcdefghijklmnopqrstuvxx”
,由于字节顺序,它被颠倒了。

这在编译时不起作用。赋值的左侧应始终是一个变量。反编译可能有问题。我从注释中了解到,
0x75767778
是“uvwx”(或者可能是“xwvu”)的十六进制ascii序列。这项任务可能在汇编中有效,但另一项任务是无法理解的。不管怎样,这可能只是反编译器中的一个bug吗?这看起来像是反编译器中的bug。它生成的代码不是有效的C(甚至是不合理的)。请更新该问题以说明您是如何“反编译”的。