鱼C论坛

 找回密码
 立即注册
查看: 1425|回复: 3

[已解决]关于指向指针的指针,这两个的运算过程 不理解

[复制链接]
发表于 2022-5-19 11:08:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
核心就是 (*(p+i))[j]=m++;
              *(p+i)[j]=m++;    究竟是如何运算的,看一下ida解析过程 也没看明白,只知道她们区别很大
#include <stdio.h>
#include <malloc.h>

int main()
{
    int **p=(int**)malloc(sizeof(int)*3);
    for(int i=0;i<3;i++)
    {
        p[i]=(int*)malloc(sizeof(int)*3);
    }
    int m=1;
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            *(p+i)[j]=m++;
        }
    }
    #以下是IDA解析结果
        for ( j = 0; j <= 2; ++j )
        {
            for ( k = 0; k <= 2; ++k )
            {
                v0 = v5++;
                *(_DWORD *)v2[j + k] = v0;   //这里是*(p+i)[j]=m++; 被解析成这样,所以错误
            }
        }
    #endif
    #以下是IDA解析结果
        for ( j = 0; j <= 2; ++j )
        {
            for ( k = 0; k <= 2; ++k )
            {
                v0 = v5++;
                *(_DWORD *)(v2[j]+sizeof(int)*k]) = v0;    //这里是(*(p+i))[j]=m++; 被解析成这样,所以正确
            }
        }
    #endif
    return 0;
}
最佳答案
2022-5-19 11:52:23
看反汇编代码就很清楚了
#include <stdio.h>
#include <malloc.h>

int main() {
    int **p;
    int n = 0;
    n = 2;

    p = malloc(sizeof(*p) * n);
    for(size_t i = 0; i < n; ++i) {
        p[i] = malloc(sizeof(*p[i]) * n);
    }

    int m = 1;
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            (*(p + i))[j] = m++;
            *(p + i)[j] = m++;
        }
    }

    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            printf("%4d  ", p[i][j]);
        }
        printf("\n");
    }

    for(size_t i = 0; i < n; ++i) free(p[i]);
    free(p);
    return 0;
}
int main() {
    1169:   55                      pushq  %rbp
    116a:   48 89 e5                movq   %rsp,%rbp
    116d:   53                      pushq  %rbx
    116e:   48 83 ec 38             subq   $0x38,%rsp
    int **p;
    int n = 0;
    1172:   c7 45 d4 00 00 00 00    movl   $0x0,-0x2c(%rbp)
    n = 2;
    1179:   c7 45 d4 02 00 00 00    movl   $0x2,-0x2c(%rbp)

    p = malloc(sizeof(*p) * n);
    1180:   8b 45 d4                movl   -0x2c(%rbp),%eax
    1183:   48 98                   cltq   
    1185:   48 c1 e0 03             shlq   $0x3,%rax
    1189:   48 89 c7                movq   %rax,%rdi
    118c:   e8 cf fe ff ff          callq  1060 <malloc@plt>
    1191:   48 89 45 e8             movq   %rax,-0x18(%rbp)
    for(size_t i = 0; i < n; ++i) {
    1195:   48 c7 45 d8 00 00 00    movq   $0x0,-0x28(%rbp)
    119c:   00 
    119d:   eb 2d                   jmp    11cc <main+0x63>
        p[i] = malloc(sizeof(*p[i]) * n);
    119f:   8b 45 d4                movl   -0x2c(%rbp),%eax
    11a2:   48 98                   cltq   
    11a4:   48 c1 e0 02             shlq   $0x2,%rax
    11a8:   48 8b 55 d8             movq   -0x28(%rbp),%rdx
    11ac:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
    11b3:   00 
    11b4:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
    11b8:   48 8d 1c 11             leaq   (%rcx,%rdx,1),%rbx
    11bc:   48 89 c7                movq   %rax,%rdi
    11bf:   e8 9c fe ff ff          callq  1060 <malloc@plt>
    11c4:   48 89 03                movq   %rax,(%rbx)
    for(size_t i = 0; i < n; ++i) {
    11c7:   48 83 45 d8 01          addq   $0x1,-0x28(%rbp)
    11cc:   8b 45 d4                movl   -0x2c(%rbp),%eax
    11cf:   48 98                   cltq   
    11d1:   48 39 45 d8             cmpq   %rax,-0x28(%rbp)
    11d5:   72 c8                   jb     119f <main+0x36>
    }

    int m = 1;
    11d7:   c7 45 c0 01 00 00 00    movl   $0x1,-0x40(%rbp)
    for(int i = 0; i < n; i++) {
    11de:   c7 45 c4 00 00 00 00    movl   $0x0,-0x3c(%rbp)
    11e5:   eb 75                   jmp    125c <main+0xf3>
        for(int j = 0; j < n; j++) {
    11e7:   c7 45 c8 00 00 00 00    movl   $0x0,-0x38(%rbp)
    11ee:   eb 60                   jmp    1250 <main+0xe7>
            (*(p + i))[j] = m++;
    11f0:   8b 45 c0                movl   -0x40(%rbp),%eax
    11f3:   8d 50 01                leal   0x1(%rax),%edx
    11f6:   89 55 c0                movl   %edx,-0x40(%rbp)
    11f9:   8b 55 c4                movl   -0x3c(%rbp),%edx
    11fc:   48 63 d2                movslq %edx,%rdx
    11ff:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
    1206:   00 
    1207:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
    120b:   48 01 ca                addq   %rcx,%rdx
    120e:   48 8b 0a                movq   (%rdx),%rcx
    1211:   8b 55 c8                movl   -0x38(%rbp),%edx
    1214:   48 63 d2                movslq %edx,%rdx
    1217:   48 c1 e2 02             shlq   $0x2,%rdx
    121b:   48 01 ca                addq   %rcx,%rdx
    121e:   89 02                   movl   %eax,(%rdx)
            *(p + i)[j] = m++;
    1220:   8b 45 c0                movl   -0x40(%rbp),%eax
    1223:   8d 50 01                leal   0x1(%rax),%edx
    1226:   89 55 c0                movl   %edx,-0x40(%rbp)
    1229:   8b 55 c4                movl   -0x3c(%rbp),%edx
    122c:   48 63 ca                movslq %edx,%rcx
    122f:   8b 55 c8                movl   -0x38(%rbp),%edx
    1232:   48 63 d2                movslq %edx,%rdx
    1235:   48 01 ca                addq   %rcx,%rdx
    1238:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
    123f:   00 
    1240:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
    1244:   48 01 ca                addq   %rcx,%rdx
    1247:   48 8b 12                movq   (%rdx),%rdx
    124a:   89 02                   movl   %eax,(%rdx)
        for(int j = 0; j < n; j++) {
    124c:   83 45 c8 01             addl   $0x1,-0x38(%rbp)
    1250:   8b 45 c8                movl   -0x38(%rbp),%eax
    1253:   3b 45 d4                cmpl   -0x2c(%rbp),%eax
    1256:   7c 98                   jl     11f0 <main+0x87>
    for(int i = 0; i < n; i++) {
    1258:   83 45 c4 01             addl   $0x1,-0x3c(%rbp)
    125c:   8b 45 c4                movl   -0x3c(%rbp),%eax
    125f:   3b 45 d4                cmpl   -0x2c(%rbp),%eax
    1262:   7c 83                   jl     11e7 <main+0x7e>
        }
    }

    for(int i = 0; i < n; i++) {
    1264:   c7 45 cc 00 00 00 00    movl   $0x0,-0x34(%rbp)
    126b:   eb 5e                   jmp    12cb <main+0x162>
        for(int j = 0; j < n; j++) {
    126d:   c7 45 d0 00 00 00 00    movl   $0x0,-0x30(%rbp)
    1274:   eb 3f                   jmp    12b5 <main+0x14c>
            printf("%4d  ", p[i][j]);
    1276:   8b 45 cc                movl   -0x34(%rbp),%eax
    1279:   48 98                   cltq   
    127b:   48 8d 14 c5 00 00 00    leaq   0x0(,%rax,8),%rdx
    1282:   00 
    1283:   48 8b 45 e8             movq   -0x18(%rbp),%rax
    1287:   48 01 d0                addq   %rdx,%rax
    128a:   48 8b 10                movq   (%rax),%rdx
    128d:   8b 45 d0                movl   -0x30(%rbp),%eax
    1290:   48 98                   cltq   
    1292:   48 c1 e0 02             shlq   $0x2,%rax
    1296:   48 01 d0                addq   %rdx,%rax
    1299:   8b 00                   movl   (%rax),%eax
    129b:   89 c6                   movl   %eax,%esi
    129d:   48 8d 05 60 0d 00 00    leaq   0xd60(%rip),%rax        # 2004 <_IO_stdin_used+0x4>
    12a4:   48 89 c7                movq   %rax,%rdi
    12a7:   b8 00 00 00 00          movl   $0x0,%eax
    12ac:   e8 9f fd ff ff          callq  1050 <printf@plt>
        for(int j = 0; j < n; j++) {
    12b1:   83 45 d0 01             addl   $0x1,-0x30(%rbp)
    12b5:   8b 45 d0                movl   -0x30(%rbp),%eax
    12b8:   3b 45 d4                cmpl   -0x2c(%rbp),%eax
    12bb:   7c b9                   jl     1276 <main+0x10d>
        }
        printf("\n");
    12bd:   bf 0a 00 00 00          movl   $0xa,%edi
    12c2:   e8 79 fd ff ff          callq  1040 <putchar@plt>
    for(int i = 0; i < n; i++) {
    12c7:   83 45 cc 01             addl   $0x1,-0x34(%rbp)
    12cb:   8b 45 cc                movl   -0x34(%rbp),%eax
    12ce:   3b 45 d4                cmpl   -0x2c(%rbp),%eax
    12d1:   7c 9a                   jl     126d <main+0x104>
    }

    for(size_t i = 0; i < n; ++i) free(p[i]);
    12d3:   48 c7 45 e0 00 00 00    movq   $0x0,-0x20(%rbp)
    12da:   00 
    12db:   eb 23                   jmp    1300 <main+0x197>
    12dd:   48 8b 45 e0             movq   -0x20(%rbp),%rax
    12e1:   48 8d 14 c5 00 00 00    leaq   0x0(,%rax,8),%rdx
    12e8:   00 
    12e9:   48 8b 45 e8             movq   -0x18(%rbp),%rax
    12ed:   48 01 d0                addq   %rdx,%rax
    12f0:   48 8b 00                movq   (%rax),%rax
    12f3:   48 89 c7                movq   %rax,%rdi
    12f6:   e8 35 fd ff ff          callq  1030 <free@plt>
    12fb:   48 83 45 e0 01          addq   $0x1,-0x20(%rbp)
    1300:   8b 45 d4                movl   -0x2c(%rbp),%eax
    1303:   48 98                   cltq   
    1305:   48 39 45 e0             cmpq   %rax,-0x20(%rbp)
    1309:   72 d2                   jb     12dd <main+0x174>
    free(p);
    130b:   48 8b 45 e8             movq   -0x18(%rbp),%rax
    130f:   48 89 c7                movq   %rax,%rdi
    1312:   e8 19 fd ff ff          callq  1030 <free@plt>
    return 0;
    1317:   b8 00 00 00 00          movl   $0x0,%eax
}
    131c:   48 8b 5d f8             movq   -0x8(%rbp),%rbx
    1320:   c9                      leaveq 
    1321:   c3                      retq   
            (*(p + i))[j] = m++;
    11f0:   8b 45 c0                movl   -0x40(%rbp),%eax
    11f3:   8d 50 01                leal   0x1(%rax),%edx
    11f6:   89 55 c0                movl   %edx,-0x40(%rbp)
    11f9:   8b 55 c4                movl   -0x3c(%rbp),%edx
    11fc:   48 63 d2                movslq %edx,%rdx
    11ff:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
    1206:   00 
    1207:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
    120b:   48 01 ca                addq   %rcx,%rdx
    120e:   48 8b 0a                movq   (%rdx),%rcx
    1211:   8b 55 c8                movl   -0x38(%rbp),%edx
    1214:   48 63 d2                movslq %edx,%rdx
    1217:   48 c1 e2 02             shlq   $0x2,%rdx
    121b:   48 01 ca                addq   %rcx,%rdx
    121e:   89 02                   movl   %eax,(%rdx)
            *(p + i)[j] = m++;
    1220:   8b 45 c0                movl   -0x40(%rbp),%eax
    1223:   8d 50 01                leal   0x1(%rax),%edx
    1226:   89 55 c0                movl   %edx,-0x40(%rbp)
    1229:   8b 55 c4                movl   -0x3c(%rbp),%edx
    122c:   48 63 ca                movslq %edx,%rcx
    122f:   8b 55 c8                movl   -0x38(%rbp),%edx
    1232:   48 63 d2                movslq %edx,%rdx
    1235:   48 01 ca                addq   %rcx,%rdx
    1238:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
    123f:   00 
    1240:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
    1244:   48 01 ca                addq   %rcx,%rdx
    1247:   48 8b 12                movq   (%rdx),%rdx
    124a:   89 02                   movl   %eax,(%rdx)
[]优先级高于*
所以
*(p + i)[j]
*((p + i)[j])
这两个是一样的

a[b] 可以写成 *(a + b)

(p + i)[j] 可以写成 *((p + i) + j),也就是 *(p + i + j)
*((p + i)[j]) 就是 **(p + i + j)
            *(p + i)[j] = m++;
    1220:   8b 45 c0                movl   -0x40(%rbp),%eax
    1223:   8d 50 01                leal   0x1(%rax),%edx
    1226:   89 55 c0                movl   %edx,-0x40(%rbp)
    1229:   8b 55 c4                movl   -0x3c(%rbp),%edx
    122c:   48 63 ca                movslq %edx,%rcx
    122f:   8b 55 c8                movl   -0x38(%rbp),%edx
    1232:   48 63 d2                movslq %edx,%rdx
    1235:   48 01 ca                addq   %rcx,%rdx
    1238:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
    123f:   00 
    1240:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
    1244:   48 01 ca                addq   %rcx,%rdx
    1247:   48 8b 12                movq   (%rdx),%rdx
    124a:   89 02                   movl   %eax,(%rdx)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-19 11:52:23 | 显示全部楼层    本楼为最佳答案   
看反汇编代码就很清楚了
#include <stdio.h>
#include <malloc.h>

int main() {
    int **p;
    int n = 0;
    n = 2;

    p = malloc(sizeof(*p) * n);
    for(size_t i = 0; i < n; ++i) {
        p[i] = malloc(sizeof(*p[i]) * n);
    }

    int m = 1;
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            (*(p + i))[j] = m++;
            *(p + i)[j] = m++;
        }
    }

    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            printf("%4d  ", p[i][j]);
        }
        printf("\n");
    }

    for(size_t i = 0; i < n; ++i) free(p[i]);
    free(p);
    return 0;
}
int main() {
    1169:   55                      pushq  %rbp
    116a:   48 89 e5                movq   %rsp,%rbp
    116d:   53                      pushq  %rbx
    116e:   48 83 ec 38             subq   $0x38,%rsp
    int **p;
    int n = 0;
    1172:   c7 45 d4 00 00 00 00    movl   $0x0,-0x2c(%rbp)
    n = 2;
    1179:   c7 45 d4 02 00 00 00    movl   $0x2,-0x2c(%rbp)

    p = malloc(sizeof(*p) * n);
    1180:   8b 45 d4                movl   -0x2c(%rbp),%eax
    1183:   48 98                   cltq   
    1185:   48 c1 e0 03             shlq   $0x3,%rax
    1189:   48 89 c7                movq   %rax,%rdi
    118c:   e8 cf fe ff ff          callq  1060 <malloc@plt>
    1191:   48 89 45 e8             movq   %rax,-0x18(%rbp)
    for(size_t i = 0; i < n; ++i) {
    1195:   48 c7 45 d8 00 00 00    movq   $0x0,-0x28(%rbp)
    119c:   00 
    119d:   eb 2d                   jmp    11cc <main+0x63>
        p[i] = malloc(sizeof(*p[i]) * n);
    119f:   8b 45 d4                movl   -0x2c(%rbp),%eax
    11a2:   48 98                   cltq   
    11a4:   48 c1 e0 02             shlq   $0x2,%rax
    11a8:   48 8b 55 d8             movq   -0x28(%rbp),%rdx
    11ac:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
    11b3:   00 
    11b4:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
    11b8:   48 8d 1c 11             leaq   (%rcx,%rdx,1),%rbx
    11bc:   48 89 c7                movq   %rax,%rdi
    11bf:   e8 9c fe ff ff          callq  1060 <malloc@plt>
    11c4:   48 89 03                movq   %rax,(%rbx)
    for(size_t i = 0; i < n; ++i) {
    11c7:   48 83 45 d8 01          addq   $0x1,-0x28(%rbp)
    11cc:   8b 45 d4                movl   -0x2c(%rbp),%eax
    11cf:   48 98                   cltq   
    11d1:   48 39 45 d8             cmpq   %rax,-0x28(%rbp)
    11d5:   72 c8                   jb     119f <main+0x36>
    }

    int m = 1;
    11d7:   c7 45 c0 01 00 00 00    movl   $0x1,-0x40(%rbp)
    for(int i = 0; i < n; i++) {
    11de:   c7 45 c4 00 00 00 00    movl   $0x0,-0x3c(%rbp)
    11e5:   eb 75                   jmp    125c <main+0xf3>
        for(int j = 0; j < n; j++) {
    11e7:   c7 45 c8 00 00 00 00    movl   $0x0,-0x38(%rbp)
    11ee:   eb 60                   jmp    1250 <main+0xe7>
            (*(p + i))[j] = m++;
    11f0:   8b 45 c0                movl   -0x40(%rbp),%eax
    11f3:   8d 50 01                leal   0x1(%rax),%edx
    11f6:   89 55 c0                movl   %edx,-0x40(%rbp)
    11f9:   8b 55 c4                movl   -0x3c(%rbp),%edx
    11fc:   48 63 d2                movslq %edx,%rdx
    11ff:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
    1206:   00 
    1207:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
    120b:   48 01 ca                addq   %rcx,%rdx
    120e:   48 8b 0a                movq   (%rdx),%rcx
    1211:   8b 55 c8                movl   -0x38(%rbp),%edx
    1214:   48 63 d2                movslq %edx,%rdx
    1217:   48 c1 e2 02             shlq   $0x2,%rdx
    121b:   48 01 ca                addq   %rcx,%rdx
    121e:   89 02                   movl   %eax,(%rdx)
            *(p + i)[j] = m++;
    1220:   8b 45 c0                movl   -0x40(%rbp),%eax
    1223:   8d 50 01                leal   0x1(%rax),%edx
    1226:   89 55 c0                movl   %edx,-0x40(%rbp)
    1229:   8b 55 c4                movl   -0x3c(%rbp),%edx
    122c:   48 63 ca                movslq %edx,%rcx
    122f:   8b 55 c8                movl   -0x38(%rbp),%edx
    1232:   48 63 d2                movslq %edx,%rdx
    1235:   48 01 ca                addq   %rcx,%rdx
    1238:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
    123f:   00 
    1240:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
    1244:   48 01 ca                addq   %rcx,%rdx
    1247:   48 8b 12                movq   (%rdx),%rdx
    124a:   89 02                   movl   %eax,(%rdx)
        for(int j = 0; j < n; j++) {
    124c:   83 45 c8 01             addl   $0x1,-0x38(%rbp)
    1250:   8b 45 c8                movl   -0x38(%rbp),%eax
    1253:   3b 45 d4                cmpl   -0x2c(%rbp),%eax
    1256:   7c 98                   jl     11f0 <main+0x87>
    for(int i = 0; i < n; i++) {
    1258:   83 45 c4 01             addl   $0x1,-0x3c(%rbp)
    125c:   8b 45 c4                movl   -0x3c(%rbp),%eax
    125f:   3b 45 d4                cmpl   -0x2c(%rbp),%eax
    1262:   7c 83                   jl     11e7 <main+0x7e>
        }
    }

    for(int i = 0; i < n; i++) {
    1264:   c7 45 cc 00 00 00 00    movl   $0x0,-0x34(%rbp)
    126b:   eb 5e                   jmp    12cb <main+0x162>
        for(int j = 0; j < n; j++) {
    126d:   c7 45 d0 00 00 00 00    movl   $0x0,-0x30(%rbp)
    1274:   eb 3f                   jmp    12b5 <main+0x14c>
            printf("%4d  ", p[i][j]);
    1276:   8b 45 cc                movl   -0x34(%rbp),%eax
    1279:   48 98                   cltq   
    127b:   48 8d 14 c5 00 00 00    leaq   0x0(,%rax,8),%rdx
    1282:   00 
    1283:   48 8b 45 e8             movq   -0x18(%rbp),%rax
    1287:   48 01 d0                addq   %rdx,%rax
    128a:   48 8b 10                movq   (%rax),%rdx
    128d:   8b 45 d0                movl   -0x30(%rbp),%eax
    1290:   48 98                   cltq   
    1292:   48 c1 e0 02             shlq   $0x2,%rax
    1296:   48 01 d0                addq   %rdx,%rax
    1299:   8b 00                   movl   (%rax),%eax
    129b:   89 c6                   movl   %eax,%esi
    129d:   48 8d 05 60 0d 00 00    leaq   0xd60(%rip),%rax        # 2004 <_IO_stdin_used+0x4>
    12a4:   48 89 c7                movq   %rax,%rdi
    12a7:   b8 00 00 00 00          movl   $0x0,%eax
    12ac:   e8 9f fd ff ff          callq  1050 <printf@plt>
        for(int j = 0; j < n; j++) {
    12b1:   83 45 d0 01             addl   $0x1,-0x30(%rbp)
    12b5:   8b 45 d0                movl   -0x30(%rbp),%eax
    12b8:   3b 45 d4                cmpl   -0x2c(%rbp),%eax
    12bb:   7c b9                   jl     1276 <main+0x10d>
        }
        printf("\n");
    12bd:   bf 0a 00 00 00          movl   $0xa,%edi
    12c2:   e8 79 fd ff ff          callq  1040 <putchar@plt>
    for(int i = 0; i < n; i++) {
    12c7:   83 45 cc 01             addl   $0x1,-0x34(%rbp)
    12cb:   8b 45 cc                movl   -0x34(%rbp),%eax
    12ce:   3b 45 d4                cmpl   -0x2c(%rbp),%eax
    12d1:   7c 9a                   jl     126d <main+0x104>
    }

    for(size_t i = 0; i < n; ++i) free(p[i]);
    12d3:   48 c7 45 e0 00 00 00    movq   $0x0,-0x20(%rbp)
    12da:   00 
    12db:   eb 23                   jmp    1300 <main+0x197>
    12dd:   48 8b 45 e0             movq   -0x20(%rbp),%rax
    12e1:   48 8d 14 c5 00 00 00    leaq   0x0(,%rax,8),%rdx
    12e8:   00 
    12e9:   48 8b 45 e8             movq   -0x18(%rbp),%rax
    12ed:   48 01 d0                addq   %rdx,%rax
    12f0:   48 8b 00                movq   (%rax),%rax
    12f3:   48 89 c7                movq   %rax,%rdi
    12f6:   e8 35 fd ff ff          callq  1030 <free@plt>
    12fb:   48 83 45 e0 01          addq   $0x1,-0x20(%rbp)
    1300:   8b 45 d4                movl   -0x2c(%rbp),%eax
    1303:   48 98                   cltq   
    1305:   48 39 45 e0             cmpq   %rax,-0x20(%rbp)
    1309:   72 d2                   jb     12dd <main+0x174>
    free(p);
    130b:   48 8b 45 e8             movq   -0x18(%rbp),%rax
    130f:   48 89 c7                movq   %rax,%rdi
    1312:   e8 19 fd ff ff          callq  1030 <free@plt>
    return 0;
    1317:   b8 00 00 00 00          movl   $0x0,%eax
}
    131c:   48 8b 5d f8             movq   -0x8(%rbp),%rbx
    1320:   c9                      leaveq 
    1321:   c3                      retq   
            (*(p + i))[j] = m++;
    11f0:   8b 45 c0                movl   -0x40(%rbp),%eax
    11f3:   8d 50 01                leal   0x1(%rax),%edx
    11f6:   89 55 c0                movl   %edx,-0x40(%rbp)
    11f9:   8b 55 c4                movl   -0x3c(%rbp),%edx
    11fc:   48 63 d2                movslq %edx,%rdx
    11ff:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
    1206:   00 
    1207:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
    120b:   48 01 ca                addq   %rcx,%rdx
    120e:   48 8b 0a                movq   (%rdx),%rcx
    1211:   8b 55 c8                movl   -0x38(%rbp),%edx
    1214:   48 63 d2                movslq %edx,%rdx
    1217:   48 c1 e2 02             shlq   $0x2,%rdx
    121b:   48 01 ca                addq   %rcx,%rdx
    121e:   89 02                   movl   %eax,(%rdx)
            *(p + i)[j] = m++;
    1220:   8b 45 c0                movl   -0x40(%rbp),%eax
    1223:   8d 50 01                leal   0x1(%rax),%edx
    1226:   89 55 c0                movl   %edx,-0x40(%rbp)
    1229:   8b 55 c4                movl   -0x3c(%rbp),%edx
    122c:   48 63 ca                movslq %edx,%rcx
    122f:   8b 55 c8                movl   -0x38(%rbp),%edx
    1232:   48 63 d2                movslq %edx,%rdx
    1235:   48 01 ca                addq   %rcx,%rdx
    1238:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
    123f:   00 
    1240:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
    1244:   48 01 ca                addq   %rcx,%rdx
    1247:   48 8b 12                movq   (%rdx),%rdx
    124a:   89 02                   movl   %eax,(%rdx)
[]优先级高于*
所以
*(p + i)[j]
*((p + i)[j])
这两个是一样的

a[b] 可以写成 *(a + b)

(p + i)[j] 可以写成 *((p + i) + j),也就是 *(p + i + j)
*((p + i)[j]) 就是 **(p + i + j)
            *(p + i)[j] = m++;
    1220:   8b 45 c0                movl   -0x40(%rbp),%eax
    1223:   8d 50 01                leal   0x1(%rax),%edx
    1226:   89 55 c0                movl   %edx,-0x40(%rbp)
    1229:   8b 55 c4                movl   -0x3c(%rbp),%edx
    122c:   48 63 ca                movslq %edx,%rcx
    122f:   8b 55 c8                movl   -0x38(%rbp),%edx
    1232:   48 63 d2                movslq %edx,%rdx
    1235:   48 01 ca                addq   %rcx,%rdx
    1238:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
    123f:   00 
    1240:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
    1244:   48 01 ca                addq   %rcx,%rdx
    1247:   48 8b 12                movq   (%rdx),%rdx
    124a:   89 02                   movl   %eax,(%rdx)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-20 08:48:04 | 显示全部楼层
$ objdump -S -M suffix main
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-20 12:20:51 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 14:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表