我写了一个小程序,它反转一个字符串并将其打印到屏幕上:
void ReverseString(char *String)
{
char *Begin = String;
char *End = String + strlen(String) - 1;
char TempChar = '\0';
while (Begin < End)
{
TempChar = *Begin;
*Begin = *End;
*End = TempChar;
Begin++;
End--;
}
printf("%s",String);
}
它在Windows上的Dev C ++(小端)中完美运行。 但我突然怀疑它的效率。如果你看这一行:
while (Begin < End)
我正在比较开头和结尾的地址。这是正确的方法吗? 此代码是否适用于Mac OS X等大端操作系统? 或者我的想法是错误的?
我有几个疑问,我在上面提到过。 有人可以澄清一下吗?
答案 0 :(得分:6)
您的代码没有与字节顺序相关的问题。你比较两个指针的方式也没什么不对。简而言之,您的代码很好。
答案 1 :(得分:3)
字节顺序定义为多字节基本类型中字节的重要性顺序。因此,如果您的int
是big-endian,那意味着内存中int
的第一个字节(即地址最低的那个)包含int
的最高有效位,并且所以到最后/最不重要。这意味着所有。当我们说一个系统是big-endian时,这通常意味着它的所有指针和算术类型都是big-endian,尽管那里有一些奇怪的特殊情况。 Endian-ness不影响指针算术或比较,也不影响字符串存储在内存中的顺序。
您的代码不使用任何多字节基元类型[*],因此endian-ness无关紧要。通常,如果以某种方式访问此类对象的各个字节(例如,通过将指针转换为unsigned char*
,将内存写入文件或通过网络等),则字节序只会变得相关。
假设呼叫者做了类似这样的事情:
int x = 0x00010203; // assuming sizeof(int) == 4 and CHAR_BIT == 8
ReverseString((char *)&x);
然后他们的代码将依赖于字节序。在big-endian系统上,它们会传递一个空字符串,因为第一个字节是0,所以你的代码会保持x
不变。在little-endian系统上,他们会传递一个三字节的字符串,因为前三个字节是0x03
,0x02
,0x01
和第四个字节0,所以你的代码会将x
更改为0x00030201
[*]好吧,指针是多字节的,在OSX和几乎每个C实现上都是如此。但是你没有检查他们的存储表示,你只是将它们用作值,因此根据字节顺序,行为没有机会不同。
答案 2 :(得分:1)
据我所知,endianness不会影响char *,因为每个字符都是单个字节并形成一个字符数组。看看http://www.ibm.com/developerworks/aix/library/au-endianc/index.html?ca=drs- 在多字节数据类型(如int)中可以看到效果。
答案 3 :(得分:1)
只要你操纵整个type T
对象(这就是你对type T
char
所做的那样),你就不会遇到字节序问题。
如果你试图在较大的类型中操作单独的字节(例如int
),你可能会遇到它们,但是你不做那样的事情。这就是为什么在你的代码中,字符串问题是不可能的。