0

在下面的程序中,假设 a 存储在地址 1000 并且 int 占用 4bytes 的存储空间。现在,c 将指向基地址,即 1000 并将其增加 3 将使其指向地址 1003。现在,打印 c 指向的字符必须给我对应于 ascii 65 的字符。但它什么也没打印!

#include<stdio.h>
#include<stdlib.h>

int main(){
    int a = 65;
    char *c = &a;
    printf("%c\n", *(c+3));
}

我的推理有什么问题?

4

2 回答 2

7

你没有考虑字节序。在 little-endian 系统上,'a'(或者如果编码不兼容 ASCII,无论如何65)将在第一个字节中,而其他字节为 0。传递 0 字节只printf("%c\n",_);打印换行符。

于 2013-06-16T12:51:44.780 回答
3

打印 c 指向的字符必须给我对应 ascii 65 的字符

它应该,如果你的机器是 little-endian,它确实会。但是,您正在打印intusing的第 4 个字节*(c + 3),仍然是 0。也许您的意思是*c相反?


然而,最好的办法是不要通过指针给东西起别名。整数有一个很好的属性,可以通过位运算符对其进行操作。

uint32_t i = 0x12345678;
uint8_t b0 = (i >>  0) & 0xff;
uint8_t b1 = (i >>  8) & 0xff;
uint8_t b2 = (i >> 16) & 0xff;
uint8_t b3 = (i >> 24) & 0xff;

无论酸性架构的字节序如何,这将使您能够正确访问字节。

于 2013-06-16T12:53:51.683 回答