gpt4 book ai didi

c - 在 C 中添加整数类型时,指针算术到底是如何工作的?

转载 作者:行者123 更新时间:2023-11-30 18:23:51 25 4
gpt4 key购买 nike

在 C 语言中,给定

char arr [10];
uint32_t i = -1;
char * p = &arr [1];

(p + i) 是否溢出/未定义或等于 &arr [0]?为什么C标准(6.5.6.8)中的指针运算规则如此困惑?

语言定义指针可以对任何整数类型进行+、-、+=、-=操作,当指针加上负int值时会发生什么?如果指针的表示形式是 4 个字节但整数操作数是 int64_t 怎么办?

C99标准定义了数组索引项中的指针运算(6.5.6.8),根据我的理解,它指出:

char * ptr = …;
char * new_ptr = ptr + int_expr;

assert( (new_ptr - ptr) == (int_expr) );

这种模糊的、间接的定义的原因是什么?

最佳答案

-1 分配给 uint32_t 会将其转换为 UINT32_MAX(即 4294967295),每 reduced modulo, 6.2.5p9 .

所以你的代码相当于:

char arr [10];
uint32_t i = UINT32_MAX;
char * p = &arr [1];

p 指向数组arr 中的第二个元素。因此,p+i(即 p + 4294967295)生成的指针肯定不在数组对象内。所以它是 undefined behaviour .

例如,如果将 i 的类型更改为 int32_t,那么它可以保存负值(正如您一开始可能希望的那样)。p + i,即 p - 1 将产生一个指向数组 arr 中第一个元素的指针(相当于 &arr[ 0])。没有未定义的行为因为生成的指针 p + i (== &arr[0]) 仍然指向数组对象内并且完全有效。

关于c - 在 C 中添加整数类型时,指针算术到底是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48962640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com