一位和我一起工作的实习生向我展示了他在计算机科学中参加的关于endianness问题的考试.有一个问题显示了一个ASCII字符串"My Pizza",学生必须展示这个字符串如何在一台小型endian计算机的内存中表示.当然,这听起来像一个技巧性的问题,因为ASCII字符串不受endian问题的影响.

但令人震惊的是,实习生声称他的教授坚持认为字符串将被表示为:

P-yM azzi

我知道这不可能是对的.ASCII字符串在任何机器上都不可能这样表示.但显然,教授坚持这一点.所以,我写了一个小C程序,让实习生把它交给他的教授.

#include <string.h>
#include <stdio.h>

int main()
{
    const char* s = "My-Pizza";
    size_t length = strlen(s);
    for (const char* it = s; it < s + length; ++it) {
        printf("%p : %c\n", it, *it);
    }
}

这清楚地表明该字符串在内存中存储为"my-Pizza".一天后,实习生回复我,告诉我教授现在声称C正在自动转换地址,以便按正确的顺序显示字符串.

我告诉他他的教授疯了,这显然是错误的.但只是为了判断一下我自己的理智,我决定把这篇文章贴在Stackoverflow上,这样我就可以让其他人来证实我说的话.

所以,我要问:谁在这里?

推荐答案

毫无疑问,你是对的.

ANSI C标准6.1.4规定字符串文字通过"连接"文字中的字符存储在内存中.

ANSI标准6.3.6还规定了添加对指针值的影响:

当向指针添加或从指针减go 整数类型的表达式时,结果具有指针操作数的类型.如果指针操作数指向数组对象的元素,并且数组足够大,则结果指向距原始元素的元素偏移量,以便结果数组元素和原始数组元素的下标差等于整数表达式.

如果这个人的 idea 是正确的,那么当整数被用作数组索引时,编译器还必须处理整数数学.也会产生许多其他谬误,这些谬误留给人们go 想象.

人们可能会感到困惑,因为(与字符串初始值设定项不同),多字节字符常量(如‘ABCD’are)是按字符顺序存储的.

一个人可能对此感到困惑的原因有很多.正如其他人在这里指出的,他可能误读了在调试器窗口中看到的内容,在调试器窗口中,内容被字节交换以获得int值的可读性.

C++相关问答推荐

如何在不修改字符串缓冲区早期使用的情况下覆盖字符串缓冲区

如何通过Zephyr(Devicetree)在PR Pico上设置UTE 1?

为什么PLT表中没有push指令?

是否所有C编译器在将浮点数转换为整型数时都会隐式删除小数?

LibpCap禁用监视器模式(C、MacOS)

我在这里正确地解释了C操作顺序吗?

每次除以或乘以整数都会得到0.0000

这个计算C中阶乘的函数正确吗?

用C语言计算文本文件中的整数个数

如何在C中只对字符串(包含数字、单词等)中的数字进行重复操作?

如何在VS 2022中正确安装额外的C头文件

错误...的多个定义(&Q)首先在这里定义&

C代码可以在在线编译器上运行,但不能在Leetcode上运行

使用Open62541向OPCUA服务器发送读请求时内存泄漏

如何读取程序中嵌入的数据S自己的ELF?

区分MySQL C界面中的文本和BLOB字段

如何解释数组中的*(ptr)和*(ptr+2)?

在同一范围内对具有相同类型的变量执行的相同操作在同一C代码中花费的时间不同

模仿 memmove 的行为

计算 e^x 很好.但不是 x 的罪