鱼C论坛

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

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

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

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

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

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

  1. #include <stdio.h>
  2. #include <malloc.h>

  3. int main()
  4. {
  5.     int **p=(int**)malloc(sizeof(int)*3);
  6.     for(int i=0;i<3;i++)
  7.     {
  8.         p[i]=(int*)malloc(sizeof(int)*3);
  9.     }
  10.     int m=1;
  11.     for(int i=0;i<3;i++)
  12.     {
  13.         for(int j=0;j<3;j++)
  14.         {
  15.             *(p+i)[j]=m++;
  16.         }
  17.     }
  18.     #以下是IDA解析结果
  19.         for ( j = 0; j <= 2; ++j )
  20.         {
  21.             for ( k = 0; k <= 2; ++k )
  22.             {
  23.                 v0 = v5++;
  24.                 *(_DWORD *)v2[j + k] = v0;   //这里是*(p+i)[j]=m++; 被解析成这样,所以错误
  25.             }
  26.         }
  27.     #endif
  28.     #以下是IDA解析结果
  29.         for ( j = 0; j <= 2; ++j )
  30.         {
  31.             for ( k = 0; k <= 2; ++k )
  32.             {
  33.                 v0 = v5++;
  34.                 *(_DWORD *)(v2[j]+sizeof(int)*k]) = v0;    //这里是(*(p+i))[j]=m++; 被解析成这样,所以正确
  35.             }
  36.         }
  37.     #endif
  38.     return 0;
  39. }

复制代码
最佳答案
2022-5-19 11:52:23
看反汇编代码就很清楚了

  1. #include <stdio.h>
  2. #include <malloc.h>

  3. int main() {
  4.     int **p;
  5.     int n = 0;
  6.     n = 2;

  7.     p = malloc(sizeof(*p) * n);
  8.     for(size_t i = 0; i < n; ++i) {
  9.         p[i] = malloc(sizeof(*p[i]) * n);
  10.     }

  11.     int m = 1;
  12.     for(int i = 0; i < n; i++) {
  13.         for(int j = 0; j < n; j++) {
  14.             (*(p + i))[j] = m++;
  15.             *(p + i)[j] = m++;
  16.         }
  17.     }

  18.     for(int i = 0; i < n; i++) {
  19.         for(int j = 0; j < n; j++) {
  20.             printf("%4d  ", p[i][j]);
  21.         }
  22.         printf("\n");
  23.     }

  24.     for(size_t i = 0; i < n; ++i) free(p[i]);
  25.     free(p);
  26.     return 0;
  27. }
复制代码

  1. int main() {
  2.     1169:   55                      pushq  %rbp
  3.     116a:   48 89 e5                movq   %rsp,%rbp
  4.     116d:   53                      pushq  %rbx
  5.     116e:   48 83 ec 38             subq   $0x38,%rsp
  6.     int **p;
  7.     int n = 0;
  8.     1172:   c7 45 d4 00 00 00 00    movl   $0x0,-0x2c(%rbp)
  9.     n = 2;
  10.     1179:   c7 45 d4 02 00 00 00    movl   $0x2,-0x2c(%rbp)

  11.     p = malloc(sizeof(*p) * n);
  12.     1180:   8b 45 d4                movl   -0x2c(%rbp),%eax
  13.     1183:   48 98                   cltq   
  14.     1185:   48 c1 e0 03             shlq   $0x3,%rax
  15.     1189:   48 89 c7                movq   %rax,%rdi
  16.     118c:   e8 cf fe ff ff          callq  1060 <malloc@plt>
  17.     1191:   48 89 45 e8             movq   %rax,-0x18(%rbp)
  18.     for(size_t i = 0; i < n; ++i) {
  19.     1195:   48 c7 45 d8 00 00 00    movq   $0x0,-0x28(%rbp)
  20.     119c:   00
  21.     119d:   eb 2d                   jmp    11cc <main+0x63>
  22.         p[i] = malloc(sizeof(*p[i]) * n);
  23.     119f:   8b 45 d4                movl   -0x2c(%rbp),%eax
  24.     11a2:   48 98                   cltq   
  25.     11a4:   48 c1 e0 02             shlq   $0x2,%rax
  26.     11a8:   48 8b 55 d8             movq   -0x28(%rbp),%rdx
  27.     11ac:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
  28.     11b3:   00
  29.     11b4:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
  30.     11b8:   48 8d 1c 11             leaq   (%rcx,%rdx,1),%rbx
  31.     11bc:   48 89 c7                movq   %rax,%rdi
  32.     11bf:   e8 9c fe ff ff          callq  1060 <malloc@plt>
  33.     11c4:   48 89 03                movq   %rax,(%rbx)
  34.     for(size_t i = 0; i < n; ++i) {
  35.     11c7:   48 83 45 d8 01          addq   $0x1,-0x28(%rbp)
  36.     11cc:   8b 45 d4                movl   -0x2c(%rbp),%eax
  37.     11cf:   48 98                   cltq   
  38.     11d1:   48 39 45 d8             cmpq   %rax,-0x28(%rbp)
  39.     11d5:   72 c8                   jb     119f <main+0x36>
  40.     }

  41.     int m = 1;
  42.     11d7:   c7 45 c0 01 00 00 00    movl   $0x1,-0x40(%rbp)
  43.     for(int i = 0; i < n; i++) {
  44.     11de:   c7 45 c4 00 00 00 00    movl   $0x0,-0x3c(%rbp)
  45.     11e5:   eb 75                   jmp    125c <main+0xf3>
  46.         for(int j = 0; j < n; j++) {
  47.     11e7:   c7 45 c8 00 00 00 00    movl   $0x0,-0x38(%rbp)
  48.     11ee:   eb 60                   jmp    1250 <main+0xe7>
  49.             (*(p + i))[j] = m++;
  50.     11f0:   8b 45 c0                movl   -0x40(%rbp),%eax
  51.     11f3:   8d 50 01                leal   0x1(%rax),%edx
  52.     11f6:   89 55 c0                movl   %edx,-0x40(%rbp)
  53.     11f9:   8b 55 c4                movl   -0x3c(%rbp),%edx
  54.     11fc:   48 63 d2                movslq %edx,%rdx
  55.     11ff:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
  56.     1206:   00
  57.     1207:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
  58.     120b:   48 01 ca                addq   %rcx,%rdx
  59.     120e:   48 8b 0a                movq   (%rdx),%rcx
  60.     1211:   8b 55 c8                movl   -0x38(%rbp),%edx
  61.     1214:   48 63 d2                movslq %edx,%rdx
  62.     1217:   48 c1 e2 02             shlq   $0x2,%rdx
  63.     121b:   48 01 ca                addq   %rcx,%rdx
  64.     121e:   89 02                   movl   %eax,(%rdx)
  65.             *(p + i)[j] = m++;
  66.     1220:   8b 45 c0                movl   -0x40(%rbp),%eax
  67.     1223:   8d 50 01                leal   0x1(%rax),%edx
  68.     1226:   89 55 c0                movl   %edx,-0x40(%rbp)
  69.     1229:   8b 55 c4                movl   -0x3c(%rbp),%edx
  70.     122c:   48 63 ca                movslq %edx,%rcx
  71.     122f:   8b 55 c8                movl   -0x38(%rbp),%edx
  72.     1232:   48 63 d2                movslq %edx,%rdx
  73.     1235:   48 01 ca                addq   %rcx,%rdx
  74.     1238:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
  75.     123f:   00
  76.     1240:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
  77.     1244:   48 01 ca                addq   %rcx,%rdx
  78.     1247:   48 8b 12                movq   (%rdx),%rdx
  79.     124a:   89 02                   movl   %eax,(%rdx)
  80.         for(int j = 0; j < n; j++) {
  81.     124c:   83 45 c8 01             addl   $0x1,-0x38(%rbp)
  82.     1250:   8b 45 c8                movl   -0x38(%rbp),%eax
  83.     1253:   3b 45 d4                cmpl   -0x2c(%rbp),%eax
  84.     1256:   7c 98                   jl     11f0 <main+0x87>
  85.     for(int i = 0; i < n; i++) {
  86.     1258:   83 45 c4 01             addl   $0x1,-0x3c(%rbp)
  87.     125c:   8b 45 c4                movl   -0x3c(%rbp),%eax
  88.     125f:   3b 45 d4                cmpl   -0x2c(%rbp),%eax
  89.     1262:   7c 83                   jl     11e7 <main+0x7e>
  90.         }
  91.     }

  92.     for(int i = 0; i < n; i++) {
  93.     1264:   c7 45 cc 00 00 00 00    movl   $0x0,-0x34(%rbp)
  94.     126b:   eb 5e                   jmp    12cb <main+0x162>
  95.         for(int j = 0; j < n; j++) {
  96.     126d:   c7 45 d0 00 00 00 00    movl   $0x0,-0x30(%rbp)
  97.     1274:   eb 3f                   jmp    12b5 <main+0x14c>
  98.             printf("%4d  ", p[i][j]);
  99.     1276:   8b 45 cc                movl   -0x34(%rbp),%eax
  100.     1279:   48 98                   cltq   
  101.     127b:   48 8d 14 c5 00 00 00    leaq   0x0(,%rax,8),%rdx
  102.     1282:   00
  103.     1283:   48 8b 45 e8             movq   -0x18(%rbp),%rax
  104.     1287:   48 01 d0                addq   %rdx,%rax
  105.     128a:   48 8b 10                movq   (%rax),%rdx
  106.     128d:   8b 45 d0                movl   -0x30(%rbp),%eax
  107.     1290:   48 98                   cltq   
  108.     1292:   48 c1 e0 02             shlq   $0x2,%rax
  109.     1296:   48 01 d0                addq   %rdx,%rax
  110.     1299:   8b 00                   movl   (%rax),%eax
  111.     129b:   89 c6                   movl   %eax,%esi
  112.     129d:   48 8d 05 60 0d 00 00    leaq   0xd60(%rip),%rax        # 2004 <_IO_stdin_used+0x4>
  113.     12a4:   48 89 c7                movq   %rax,%rdi
  114.     12a7:   b8 00 00 00 00          movl   $0x0,%eax
  115.     12ac:   e8 9f fd ff ff          callq  1050 <printf@plt>
  116.         for(int j = 0; j < n; j++) {
  117.     12b1:   83 45 d0 01             addl   $0x1,-0x30(%rbp)
  118.     12b5:   8b 45 d0                movl   -0x30(%rbp),%eax
  119.     12b8:   3b 45 d4                cmpl   -0x2c(%rbp),%eax
  120.     12bb:   7c b9                   jl     1276 <main+0x10d>
  121.         }
  122.         printf("\n");
  123.     12bd:   bf 0a 00 00 00          movl   $0xa,%edi
  124.     12c2:   e8 79 fd ff ff          callq  1040 <putchar@plt>
  125.     for(int i = 0; i < n; i++) {
  126.     12c7:   83 45 cc 01             addl   $0x1,-0x34(%rbp)
  127.     12cb:   8b 45 cc                movl   -0x34(%rbp),%eax
  128.     12ce:   3b 45 d4                cmpl   -0x2c(%rbp),%eax
  129.     12d1:   7c 9a                   jl     126d <main+0x104>
  130.     }

  131.     for(size_t i = 0; i < n; ++i) free(p[i]);
  132.     12d3:   48 c7 45 e0 00 00 00    movq   $0x0,-0x20(%rbp)
  133.     12da:   00
  134.     12db:   eb 23                   jmp    1300 <main+0x197>
  135.     12dd:   48 8b 45 e0             movq   -0x20(%rbp),%rax
  136.     12e1:   48 8d 14 c5 00 00 00    leaq   0x0(,%rax,8),%rdx
  137.     12e8:   00
  138.     12e9:   48 8b 45 e8             movq   -0x18(%rbp),%rax
  139.     12ed:   48 01 d0                addq   %rdx,%rax
  140.     12f0:   48 8b 00                movq   (%rax),%rax
  141.     12f3:   48 89 c7                movq   %rax,%rdi
  142.     12f6:   e8 35 fd ff ff          callq  1030 <free@plt>
  143.     12fb:   48 83 45 e0 01          addq   $0x1,-0x20(%rbp)
  144.     1300:   8b 45 d4                movl   -0x2c(%rbp),%eax
  145.     1303:   48 98                   cltq   
  146.     1305:   48 39 45 e0             cmpq   %rax,-0x20(%rbp)
  147.     1309:   72 d2                   jb     12dd <main+0x174>
  148.     free(p);
  149.     130b:   48 8b 45 e8             movq   -0x18(%rbp),%rax
  150.     130f:   48 89 c7                movq   %rax,%rdi
  151.     1312:   e8 19 fd ff ff          callq  1030 <free@plt>
  152.     return 0;
  153.     1317:   b8 00 00 00 00          movl   $0x0,%eax
  154. }
  155.     131c:   48 8b 5d f8             movq   -0x8(%rbp),%rbx
  156.     1320:   c9                      leaveq
  157.     1321:   c3                      retq   
复制代码

  1.             (*(p + i))[j] = m++;
  2.     11f0:   8b 45 c0                movl   -0x40(%rbp),%eax
  3.     11f3:   8d 50 01                leal   0x1(%rax),%edx
  4.     11f6:   89 55 c0                movl   %edx,-0x40(%rbp)
  5.     11f9:   8b 55 c4                movl   -0x3c(%rbp),%edx
  6.     11fc:   48 63 d2                movslq %edx,%rdx
  7.     11ff:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
  8.     1206:   00
  9.     1207:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
  10.     120b:   48 01 ca                addq   %rcx,%rdx
  11.     120e:   48 8b 0a                movq   (%rdx),%rcx
  12.     1211:   8b 55 c8                movl   -0x38(%rbp),%edx
  13.     1214:   48 63 d2                movslq %edx,%rdx
  14.     1217:   48 c1 e2 02             shlq   $0x2,%rdx
  15.     121b:   48 01 ca                addq   %rcx,%rdx
  16.     121e:   89 02                   movl   %eax,(%rdx)
  17.             *(p + i)[j] = m++;
  18.     1220:   8b 45 c0                movl   -0x40(%rbp),%eax
  19.     1223:   8d 50 01                leal   0x1(%rax),%edx
  20.     1226:   89 55 c0                movl   %edx,-0x40(%rbp)
  21.     1229:   8b 55 c4                movl   -0x3c(%rbp),%edx
  22.     122c:   48 63 ca                movslq %edx,%rcx
  23.     122f:   8b 55 c8                movl   -0x38(%rbp),%edx
  24.     1232:   48 63 d2                movslq %edx,%rdx
  25.     1235:   48 01 ca                addq   %rcx,%rdx
  26.     1238:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
  27.     123f:   00
  28.     1240:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
  29.     1244:   48 01 ca                addq   %rcx,%rdx
  30.     1247:   48 8b 12                movq   (%rdx),%rdx
  31.     124a:   89 02                   movl   %eax,(%rdx)
复制代码

  1. []优先级高于*
  2. 所以
  3. *(p + i)[j]
  4. *((p + i)[j])
  5. 这两个是一样的

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

  7. (p + i)[j] 可以写成 *((p + i) + j),也就是 *(p + i + j)
  8. *((p + i)[j]) 就是 **(p + i + j)
复制代码

  1.             *(p + i)[j] = m++;
  2.     1220:   8b 45 c0                movl   -0x40(%rbp),%eax
  3.     1223:   8d 50 01                leal   0x1(%rax),%edx
  4.     1226:   89 55 c0                movl   %edx,-0x40(%rbp)
  5.     1229:   8b 55 c4                movl   -0x3c(%rbp),%edx
  6.     122c:   48 63 ca                movslq %edx,%rcx
  7.     122f:   8b 55 c8                movl   -0x38(%rbp),%edx
  8.     1232:   48 63 d2                movslq %edx,%rdx
  9.     1235:   48 01 ca                addq   %rcx,%rdx
  10.     1238:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
  11.     123f:   00
  12.     1240:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
  13.     1244:   48 01 ca                addq   %rcx,%rdx
  14.     1247:   48 8b 12                movq   (%rdx),%rdx
  15.     124a:   89 02                   movl   %eax,(%rdx)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

  1. #include <stdio.h>
  2. #include <malloc.h>

  3. int main() {
  4.     int **p;
  5.     int n = 0;
  6.     n = 2;

  7.     p = malloc(sizeof(*p) * n);
  8.     for(size_t i = 0; i < n; ++i) {
  9.         p[i] = malloc(sizeof(*p[i]) * n);
  10.     }

  11.     int m = 1;
  12.     for(int i = 0; i < n; i++) {
  13.         for(int j = 0; j < n; j++) {
  14.             (*(p + i))[j] = m++;
  15.             *(p + i)[j] = m++;
  16.         }
  17.     }

  18.     for(int i = 0; i < n; i++) {
  19.         for(int j = 0; j < n; j++) {
  20.             printf("%4d  ", p[i][j]);
  21.         }
  22.         printf("\n");
  23.     }

  24.     for(size_t i = 0; i < n; ++i) free(p[i]);
  25.     free(p);
  26.     return 0;
  27. }
复制代码

  1. int main() {
  2.     1169:   55                      pushq  %rbp
  3.     116a:   48 89 e5                movq   %rsp,%rbp
  4.     116d:   53                      pushq  %rbx
  5.     116e:   48 83 ec 38             subq   $0x38,%rsp
  6.     int **p;
  7.     int n = 0;
  8.     1172:   c7 45 d4 00 00 00 00    movl   $0x0,-0x2c(%rbp)
  9.     n = 2;
  10.     1179:   c7 45 d4 02 00 00 00    movl   $0x2,-0x2c(%rbp)

  11.     p = malloc(sizeof(*p) * n);
  12.     1180:   8b 45 d4                movl   -0x2c(%rbp),%eax
  13.     1183:   48 98                   cltq   
  14.     1185:   48 c1 e0 03             shlq   $0x3,%rax
  15.     1189:   48 89 c7                movq   %rax,%rdi
  16.     118c:   e8 cf fe ff ff          callq  1060 <malloc@plt>
  17.     1191:   48 89 45 e8             movq   %rax,-0x18(%rbp)
  18.     for(size_t i = 0; i < n; ++i) {
  19.     1195:   48 c7 45 d8 00 00 00    movq   $0x0,-0x28(%rbp)
  20.     119c:   00
  21.     119d:   eb 2d                   jmp    11cc <main+0x63>
  22.         p[i] = malloc(sizeof(*p[i]) * n);
  23.     119f:   8b 45 d4                movl   -0x2c(%rbp),%eax
  24.     11a2:   48 98                   cltq   
  25.     11a4:   48 c1 e0 02             shlq   $0x2,%rax
  26.     11a8:   48 8b 55 d8             movq   -0x28(%rbp),%rdx
  27.     11ac:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
  28.     11b3:   00
  29.     11b4:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
  30.     11b8:   48 8d 1c 11             leaq   (%rcx,%rdx,1),%rbx
  31.     11bc:   48 89 c7                movq   %rax,%rdi
  32.     11bf:   e8 9c fe ff ff          callq  1060 <malloc@plt>
  33.     11c4:   48 89 03                movq   %rax,(%rbx)
  34.     for(size_t i = 0; i < n; ++i) {
  35.     11c7:   48 83 45 d8 01          addq   $0x1,-0x28(%rbp)
  36.     11cc:   8b 45 d4                movl   -0x2c(%rbp),%eax
  37.     11cf:   48 98                   cltq   
  38.     11d1:   48 39 45 d8             cmpq   %rax,-0x28(%rbp)
  39.     11d5:   72 c8                   jb     119f <main+0x36>
  40.     }

  41.     int m = 1;
  42.     11d7:   c7 45 c0 01 00 00 00    movl   $0x1,-0x40(%rbp)
  43.     for(int i = 0; i < n; i++) {
  44.     11de:   c7 45 c4 00 00 00 00    movl   $0x0,-0x3c(%rbp)
  45.     11e5:   eb 75                   jmp    125c <main+0xf3>
  46.         for(int j = 0; j < n; j++) {
  47.     11e7:   c7 45 c8 00 00 00 00    movl   $0x0,-0x38(%rbp)
  48.     11ee:   eb 60                   jmp    1250 <main+0xe7>
  49.             (*(p + i))[j] = m++;
  50.     11f0:   8b 45 c0                movl   -0x40(%rbp),%eax
  51.     11f3:   8d 50 01                leal   0x1(%rax),%edx
  52.     11f6:   89 55 c0                movl   %edx,-0x40(%rbp)
  53.     11f9:   8b 55 c4                movl   -0x3c(%rbp),%edx
  54.     11fc:   48 63 d2                movslq %edx,%rdx
  55.     11ff:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
  56.     1206:   00
  57.     1207:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
  58.     120b:   48 01 ca                addq   %rcx,%rdx
  59.     120e:   48 8b 0a                movq   (%rdx),%rcx
  60.     1211:   8b 55 c8                movl   -0x38(%rbp),%edx
  61.     1214:   48 63 d2                movslq %edx,%rdx
  62.     1217:   48 c1 e2 02             shlq   $0x2,%rdx
  63.     121b:   48 01 ca                addq   %rcx,%rdx
  64.     121e:   89 02                   movl   %eax,(%rdx)
  65.             *(p + i)[j] = m++;
  66.     1220:   8b 45 c0                movl   -0x40(%rbp),%eax
  67.     1223:   8d 50 01                leal   0x1(%rax),%edx
  68.     1226:   89 55 c0                movl   %edx,-0x40(%rbp)
  69.     1229:   8b 55 c4                movl   -0x3c(%rbp),%edx
  70.     122c:   48 63 ca                movslq %edx,%rcx
  71.     122f:   8b 55 c8                movl   -0x38(%rbp),%edx
  72.     1232:   48 63 d2                movslq %edx,%rdx
  73.     1235:   48 01 ca                addq   %rcx,%rdx
  74.     1238:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
  75.     123f:   00
  76.     1240:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
  77.     1244:   48 01 ca                addq   %rcx,%rdx
  78.     1247:   48 8b 12                movq   (%rdx),%rdx
  79.     124a:   89 02                   movl   %eax,(%rdx)
  80.         for(int j = 0; j < n; j++) {
  81.     124c:   83 45 c8 01             addl   $0x1,-0x38(%rbp)
  82.     1250:   8b 45 c8                movl   -0x38(%rbp),%eax
  83.     1253:   3b 45 d4                cmpl   -0x2c(%rbp),%eax
  84.     1256:   7c 98                   jl     11f0 <main+0x87>
  85.     for(int i = 0; i < n; i++) {
  86.     1258:   83 45 c4 01             addl   $0x1,-0x3c(%rbp)
  87.     125c:   8b 45 c4                movl   -0x3c(%rbp),%eax
  88.     125f:   3b 45 d4                cmpl   -0x2c(%rbp),%eax
  89.     1262:   7c 83                   jl     11e7 <main+0x7e>
  90.         }
  91.     }

  92.     for(int i = 0; i < n; i++) {
  93.     1264:   c7 45 cc 00 00 00 00    movl   $0x0,-0x34(%rbp)
  94.     126b:   eb 5e                   jmp    12cb <main+0x162>
  95.         for(int j = 0; j < n; j++) {
  96.     126d:   c7 45 d0 00 00 00 00    movl   $0x0,-0x30(%rbp)
  97.     1274:   eb 3f                   jmp    12b5 <main+0x14c>
  98.             printf("%4d  ", p[i][j]);
  99.     1276:   8b 45 cc                movl   -0x34(%rbp),%eax
  100.     1279:   48 98                   cltq   
  101.     127b:   48 8d 14 c5 00 00 00    leaq   0x0(,%rax,8),%rdx
  102.     1282:   00
  103.     1283:   48 8b 45 e8             movq   -0x18(%rbp),%rax
  104.     1287:   48 01 d0                addq   %rdx,%rax
  105.     128a:   48 8b 10                movq   (%rax),%rdx
  106.     128d:   8b 45 d0                movl   -0x30(%rbp),%eax
  107.     1290:   48 98                   cltq   
  108.     1292:   48 c1 e0 02             shlq   $0x2,%rax
  109.     1296:   48 01 d0                addq   %rdx,%rax
  110.     1299:   8b 00                   movl   (%rax),%eax
  111.     129b:   89 c6                   movl   %eax,%esi
  112.     129d:   48 8d 05 60 0d 00 00    leaq   0xd60(%rip),%rax        # 2004 <_IO_stdin_used+0x4>
  113.     12a4:   48 89 c7                movq   %rax,%rdi
  114.     12a7:   b8 00 00 00 00          movl   $0x0,%eax
  115.     12ac:   e8 9f fd ff ff          callq  1050 <printf@plt>
  116.         for(int j = 0; j < n; j++) {
  117.     12b1:   83 45 d0 01             addl   $0x1,-0x30(%rbp)
  118.     12b5:   8b 45 d0                movl   -0x30(%rbp),%eax
  119.     12b8:   3b 45 d4                cmpl   -0x2c(%rbp),%eax
  120.     12bb:   7c b9                   jl     1276 <main+0x10d>
  121.         }
  122.         printf("\n");
  123.     12bd:   bf 0a 00 00 00          movl   $0xa,%edi
  124.     12c2:   e8 79 fd ff ff          callq  1040 <putchar@plt>
  125.     for(int i = 0; i < n; i++) {
  126.     12c7:   83 45 cc 01             addl   $0x1,-0x34(%rbp)
  127.     12cb:   8b 45 cc                movl   -0x34(%rbp),%eax
  128.     12ce:   3b 45 d4                cmpl   -0x2c(%rbp),%eax
  129.     12d1:   7c 9a                   jl     126d <main+0x104>
  130.     }

  131.     for(size_t i = 0; i < n; ++i) free(p[i]);
  132.     12d3:   48 c7 45 e0 00 00 00    movq   $0x0,-0x20(%rbp)
  133.     12da:   00
  134.     12db:   eb 23                   jmp    1300 <main+0x197>
  135.     12dd:   48 8b 45 e0             movq   -0x20(%rbp),%rax
  136.     12e1:   48 8d 14 c5 00 00 00    leaq   0x0(,%rax,8),%rdx
  137.     12e8:   00
  138.     12e9:   48 8b 45 e8             movq   -0x18(%rbp),%rax
  139.     12ed:   48 01 d0                addq   %rdx,%rax
  140.     12f0:   48 8b 00                movq   (%rax),%rax
  141.     12f3:   48 89 c7                movq   %rax,%rdi
  142.     12f6:   e8 35 fd ff ff          callq  1030 <free@plt>
  143.     12fb:   48 83 45 e0 01          addq   $0x1,-0x20(%rbp)
  144.     1300:   8b 45 d4                movl   -0x2c(%rbp),%eax
  145.     1303:   48 98                   cltq   
  146.     1305:   48 39 45 e0             cmpq   %rax,-0x20(%rbp)
  147.     1309:   72 d2                   jb     12dd <main+0x174>
  148.     free(p);
  149.     130b:   48 8b 45 e8             movq   -0x18(%rbp),%rax
  150.     130f:   48 89 c7                movq   %rax,%rdi
  151.     1312:   e8 19 fd ff ff          callq  1030 <free@plt>
  152.     return 0;
  153.     1317:   b8 00 00 00 00          movl   $0x0,%eax
  154. }
  155.     131c:   48 8b 5d f8             movq   -0x8(%rbp),%rbx
  156.     1320:   c9                      leaveq
  157.     1321:   c3                      retq   
复制代码

  1.             (*(p + i))[j] = m++;
  2.     11f0:   8b 45 c0                movl   -0x40(%rbp),%eax
  3.     11f3:   8d 50 01                leal   0x1(%rax),%edx
  4.     11f6:   89 55 c0                movl   %edx,-0x40(%rbp)
  5.     11f9:   8b 55 c4                movl   -0x3c(%rbp),%edx
  6.     11fc:   48 63 d2                movslq %edx,%rdx
  7.     11ff:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
  8.     1206:   00
  9.     1207:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
  10.     120b:   48 01 ca                addq   %rcx,%rdx
  11.     120e:   48 8b 0a                movq   (%rdx),%rcx
  12.     1211:   8b 55 c8                movl   -0x38(%rbp),%edx
  13.     1214:   48 63 d2                movslq %edx,%rdx
  14.     1217:   48 c1 e2 02             shlq   $0x2,%rdx
  15.     121b:   48 01 ca                addq   %rcx,%rdx
  16.     121e:   89 02                   movl   %eax,(%rdx)
  17.             *(p + i)[j] = m++;
  18.     1220:   8b 45 c0                movl   -0x40(%rbp),%eax
  19.     1223:   8d 50 01                leal   0x1(%rax),%edx
  20.     1226:   89 55 c0                movl   %edx,-0x40(%rbp)
  21.     1229:   8b 55 c4                movl   -0x3c(%rbp),%edx
  22.     122c:   48 63 ca                movslq %edx,%rcx
  23.     122f:   8b 55 c8                movl   -0x38(%rbp),%edx
  24.     1232:   48 63 d2                movslq %edx,%rdx
  25.     1235:   48 01 ca                addq   %rcx,%rdx
  26.     1238:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
  27.     123f:   00
  28.     1240:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
  29.     1244:   48 01 ca                addq   %rcx,%rdx
  30.     1247:   48 8b 12                movq   (%rdx),%rdx
  31.     124a:   89 02                   movl   %eax,(%rdx)
复制代码

  1. []优先级高于*
  2. 所以
  3. *(p + i)[j]
  4. *((p + i)[j])
  5. 这两个是一样的

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

  7. (p + i)[j] 可以写成 *((p + i) + j),也就是 *(p + i + j)
  8. *((p + i)[j]) 就是 **(p + i + j)
复制代码

  1.             *(p + i)[j] = m++;
  2.     1220:   8b 45 c0                movl   -0x40(%rbp),%eax
  3.     1223:   8d 50 01                leal   0x1(%rax),%edx
  4.     1226:   89 55 c0                movl   %edx,-0x40(%rbp)
  5.     1229:   8b 55 c4                movl   -0x3c(%rbp),%edx
  6.     122c:   48 63 ca                movslq %edx,%rcx
  7.     122f:   8b 55 c8                movl   -0x38(%rbp),%edx
  8.     1232:   48 63 d2                movslq %edx,%rdx
  9.     1235:   48 01 ca                addq   %rcx,%rdx
  10.     1238:   48 8d 0c d5 00 00 00    leaq   0x0(,%rdx,8),%rcx
  11.     123f:   00
  12.     1240:   48 8b 55 e8             movq   -0x18(%rbp),%rdx
  13.     1244:   48 01 ca                addq   %rcx,%rdx
  14.     1247:   48 8b 12                movq   (%rdx),%rdx
  15.     124a:   89 02                   movl   %eax,(%rdx)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-20 08:48:04 | 显示全部楼层
  1. $ objdump -S -M suffix main
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-20 12:20:51 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-24 09:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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