跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 请教大家一个 C 指针的问题
未分類
1 1 月 2021

请教大家一个 C 指针的问题

请教大家一个 C 指针的问题

資深大佬 : GromHellscream 2

#include <stdio.h> #include <stdlib.h>  int main(int argc, char *argv[]) {  int a[4] = {150, 250, 350, 450};  int * c = a;  printf("1: a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %dn", a[0], a[1], a[2], a[3]);  c = c + 1;  printf("current c points to %dn", *c);    c = (int *) ((char *) c + 1);  *c = 500;    printf("2: a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %dn", a[0], a[1], a[2], a[3]); } 

输出:
1: a[0] = 150, a[1] = 250, a[2] = 350, a[3] = 450
current c points to 250
2: a[0] = 150, a[1] = 128250, a[2] = 256, a[3] = 450

请教下大家,最后 a[1] 和 a[2] 为什么分别变成 128250 和 256 了?
求赐教,谢谢!

大佬有話說 (9)

  • 資深大佬 : qianlv7

    c = (int *) ((char *) c + 1); int* 做运算是按 4 个字节的, char* 指针的运算是 1 个字节的, 所以这句 c 现在的位置就做 1,2 之间的内存了,然后*c = 500 就导致 2 个位置的内存都修改了部分

  • 主 資深大佬 : GromHellscream

    @qianlv7 好的,谢谢你。那能给出这个 128250 和 256 的计算过程吗?导致这两个值的原因我大概懂了,但怎么算出来的,不太懂。

  • 資深大佬 : learningman

    指针+1 的 1 指的是指针对应的数据结构的单位内存大小吧(不确定)

  • 資深大佬 : qianlv7

    @GromHellscream 你就是修改了 a[1] 的后 3 个字节,后 a[2] 的第一个字节

  • 資深大佬 : Lime

    “`c
    #include <stdio.h>
    #include <stdlib.h>

    int main(int argc, char *argv[]) {
    // 看起来你是在 x86_64 上来跑的, int 为 4-bytes, 此时内存布局为:
    //
    // a[0]
    // ↓
    // 69000000 af000000 e5100000 2c100000
    int a[4] = {150, 250, 350, 450};

    int * c = a;
    printf(“1: a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %dn”, a[0], a[1], a[2], a[3]);

    // c
    // ↓
    // 69000000 af000000 e5100000 2c100000
    c = c + 1;
    printf(“current c points to %dn”, *c);

    //
    // c
    // ↓
    // 69000000 af000000 e5100000 2c100000
    c = (int *) ((char *) c + 1);
    printf(“%pn”, c);

    // c
    // ↓
    // 69000000 af4f1000 00100000 2c100000
    //
    // 最终:
    //
    // a[0] = 0x96
    // a[1] = 0x1f4fa -> 128250
    // a[2] = 0x100 -> 256
    // a[4] = 0x1c2
    *c = 500;

    printf(“2: a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %dn”, a[0], a[1], a[2], a[3]);
    }
    “`

  • 資深大佬 : Lime

    v2ex 编辑回复真是蛋疼

    https://gist.github.com/shiyanhui/f22eb5295b48edb46b43dad1ebe54b03

  • 資深大佬 : maxhhg

    @Lime 你的小端字节序错了
    [url=https://imgchr.com/i/sCNUY9][img]https://s3.ax1x.com/2021/01/03/sCNUY9.png[/img][/url]

  • 資深大佬 : Lime

    @maxhhg fixed

  • 資深大佬 : yyttll

    32 位机器 int 占 4 个字节,char 占 1 个字节,int 指针加 1,其值加 4,char 指针加 1,其值加 1 。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具