| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6036 人关注过本帖
标题:两个指针地址可以直接比较大小吗
只看楼主 加入收藏
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
以下是引用八画小子在2020-8-20 21:07:09的发言:



也不一定完全没有意义,有些场合下,如果指向的是不同的结构体但相同地址的对象,就可以巧妙地处理一些问题了。

指向不同数组的指针比较没意义 是因为比较指向不同数组的指针是未定义行为
是因为 C/C++没有对对象内存分配顺序做限制
对于 int a, b, c; 这样3个变量 内存顺序可以是abc 可以是cba
有时候出现bac也是完全正常的
于是 对于不同的数组 比较的结果除了相等不会出现 其他结果都是有可能的
基于这样的特性没办法编程 所以说没意义

https://zh.
2020-08-21 20:30
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 11楼 lin5161678
不仅仅是这样,可以 a<b 与 b<a 同时成立。
2020-08-21 20:43
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
回复 9楼 rjsp
我说的意思是,通常C语言代码都可以被C++编译器编译,很多东西也是相同的,只是在C语言论坛多次强调C++以及C++独有的东西,会加重新手的理解负担。
2020-08-21 23:13
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用八画小子在2020-8-21 23:13:41的发言:

我说的意思是,通常C语言代码都可以被C++编译器编译,很多东西也是相同的,只是在C语言论坛多次强调C++以及C++独有的东西,会加重新手的理解负担。

同感
面向对象的代码问题也时有出现
提问题的最好能事先声明一下运行和开发平台
2020-08-22 04:42
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
以下是引用rjsp在2020-8-21 20:43:40的发言:

不仅仅是这样,可以 a<b 与 b<a 同时成立。

这种现象 我只在浮点类型比较遇到过
指针类型比较没有遇到
虽然从标准的角度来说 这样的现象也是完全没问题的
但从常见实现来看 这个情况很特别

https://zh.
2020-08-24 15:16
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 15楼 lin5161678
VC 是肯定没问题的,它保证指针严格全序

gcc/clang 据说以下代码可能会出问题,但我没试出来过
程序代码:
#include <assert.h>

int main( void )
{
    int a, b;
    assert( (a<b) == (a<b) );
}


gcc/clang 在比较随机来源的指针时,要保证正确得先转换为 uintptr_t,
但这种方法其实也不是通用的,C/C++标准没说过指针与整数必须一一映射,指针中可以包含非地址数据,指针还可以有表示同一地址的不同编码(比如古老的 段地址:段内地址 格式)。
2020-08-24 16:08
自由而无用
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:61
专家分:1456
注 册:2021-8-9
收藏
得分:0 
typedef int* ptr;
typedef ptr* pptr;

int main()
{
    int a, b;
   
    ptr p = &a, q = &b;
   
    pptr x = &p, y = &q;

    x > y ? puts("x"):puts("y");
   
    return 0;
}
2021-08-10 12:45
自由而无用
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:61
专家分:1456
注 册:2021-8-9
收藏
得分:0 
//online parser: https://www.bccn.net/run/
程序代码:
#include <stdio.h>
#include <stdlib.h>

typedef unsigned char uint8_t;

uint8_t*  calc_len(size_t size)
{
#define offset(_sz) (6 + _sz)
    uint8_t *p;
    
    p = (__builtin_return_address(0) + offset(size));
    printf("addr = %p, ret = 0x%x\n", p, p[0]);
    
    return  p;
}

int main(int argc, char *argv[]) 
{
    uint8_t *p;
    int i = 0;

    printf("hello world!\n");
    system("gcc -S *.c -o v.s");
    system("gcc -c v.s -o v.o");
    system("objdump -d v.o");
#define OP_LENS 47
    p = calc_len(OP_LENS);
    printf("p = %p, main = %p, func(main)length = %d",
    p, main, (int)(p - (uint8_t*)main));

    return 0;
}
2021-08-29 15:04
自由而无用
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:61
专家分:1456
注 册:2021-8-9
收藏
得分:0 
v.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 :
   0:    55                       push   %rbp
   1:    48 89 e5                 mov    %rsp,%rbp
   4:    48 83 ec 20              sub    $0x20,%rsp
   8:    48 89 7d e8              mov    %rdi,-0x18(%rbp)
   c:    48 8b 45 08              mov    0x8(%rbp),%rax
  10:    48 89 c2                 mov    %rax,%rdx
  13:    48 8b 45 e8              mov    -0x18(%rbp),%rax
  17:    48 83 c0 06              add    $0x6,%rax
  1b:    48 01 d0                 add    %rdx,%rax
  1e:    48 89 45 f8              mov    %rax,-0x8(%rbp)
  22:    48 8b 45 f8              mov    -0x8(%rbp),%rax
  26:    0f b6 00                 movzbl (%rax),%eax
  29:    0f b6 d0                 movzbl %al,%edx
  2c:    48 8b 45 f8              mov    -0x8(%rbp),%rax
  30:    48 89 c6                 mov    %rax,%rsi
  33:    bf 00 00 00 00           mov    $0x0,%edi
  38:    b8 00 00 00 00           mov    $0x0,%eax
  3d:    e8 00 00 00 00           callq  42
  42:    48 8b 45 f8              mov    -0x8(%rbp),%rax
  46:    c9                       leaveq
  47:    c3                       retq   

0000000000000048
:
  48:    55                       push   %rbp
  49:    48 89 e5                 mov    %rsp,%rbp
  4c:    48 83 ec 20              sub    $0x20,%rsp
  50:    89 7d ec                 mov    %edi,-0x14(%rbp)
  53:    48 89 75 e0              mov    %rsi,-0x20(%rbp)
  57:    c7 45 f4 00 00 00 00     movl   $0x0,-0xc(%rbp)
  5e:    bf 00 00 00 00           mov    $0x0,%edi
  63:    e8 00 00 00 00           callq  68
  68:    bf 00 00 00 00           mov    $0x0,%edi
  6d:    e8 00 00 00 00           callq  72
  72:    bf 00 00 00 00           mov    $0x0,%edi
  77:    e8 00 00 00 00           callq  7c
  7c:    bf 00 00 00 00           mov    $0x0,%edi
  81:    e8 00 00 00 00           callq  86
  86:    bf 2f 00 00 00           mov    $0x2f,%edi
  8b:    e8 00 00 00 00           callq  90
  90:    48 89 45 f8              mov    %rax,-0x8(%rbp)
  94:    48 8b 45 f8              mov    -0x8(%rbp),%rax
  98:    ba 00 00 00 00           mov    $0x0,%edx
  9d:    48 29 d0                 sub    %rdx,%rax
  a0:    89 c2                    mov    %eax,%edx
  a2:    48 8b 45 f8              mov    -0x8(%rbp),%rax
  a6:    89 d1                    mov    %edx,%ecx
  a8:    ba 00 00 00 00           mov    $0x0,%edx
  ad:    48 89 c6                 mov    %rax,%rsi
  b0:    bf 00 00 00 00           mov    $0x0,%edi
  b5:    b8 00 00 00 00           mov    $0x0,%eax
  ba:    e8 00 00 00 00           callq  bf
  bf:    b8 00 00 00 00           mov    $0x0,%eax
  c4:    c9                       leaveq
  c5:    c3                       retq   
hello world!
addr = 0x40067b, ret = 0xc3
p = 0x40067b, main = 0x4005fe, func(main)length = 125
2021-08-29 15:06
快速回复:两个指针地址可以直接比较大小吗
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029532 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved