鱼C论坛

 找回密码
 立即注册
查看: 1877|回复: 2

[已解决]S1E23课后作业,关于越界访问

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

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

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

x
小甲鱼说这样写会造成越界访问:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char *array[5] = {"FishC", "Five", "Star", "Good", "Wow"};
  5.         char *(*p)[5] = &array;
  6.         int i, j;

  7.         for (i = 0; i < 5; i++)
  8.         {
  9.                 for (j = 0; j < 5; j++)
  10.                 {
  11.                         if ((*p)[j][i] == '\0')
  12.                         {
  13.                                 break;
  14.                         }
  15.                         printf("%c ", (*p)[j][i]);
  16.                 }
  17.                 printf("\n");
  18.         }

  19.         return 0;
  20. }
复制代码


但我输出每一个下标,并没有越界的迹象:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     char *array[5] = {"FishC", "Five", "Star", "Good", "Wow"};
  5.     char *(*p)[5] = &array;
  6.     int i, j;

  7.     for (i = 0; i < 5; i++)
  8.     {
  9.         for (j = 0; j < 5; j++)
  10.         {
  11.             if ((*p)[j][i] == '\0')
  12.             {
  13.                 break;
  14.             }
  15. //            printf("%c ", (*p)[j][i]);
  16. //          打印出下标
  17.             printf("[%d][%d] ", j, i);
  18.         }
  19.         printf("\n");
  20.     }

  21.     return 0;
  22. }
  23. /*
  24. 输出结果:
  25. [0][0] [1][0] [2][0] [3][0] [4][0]
  26. [0][1] [1][1] [2][1] [3][1] [4][1]
  27. [0][2] [1][2] [2][2] [3][2] [4][2]
  28. [0][3] [1][3] [2][3] [3][3]
  29. [0][4]

  30. Process finished with exit code 0
  31. */
复制代码

为什么呢?
最佳答案
2022-9-11 19:47:15
对于这个程序,确实没问题,因为array中的字符串一个比一个短
但是这样的写法确实是有问题的,如果换一下array中字符串的顺序就出问题了
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         //char *array[5] = {"FishC", "Five", "Star", "Good", "Wow"};
  5.         char *array[5] = {"Wow", "Good", "Star", "Five", "FishC"};
  6.         char *(*p)[5] = &array;
  7.         int i, j;

  8.         for (i = 0; i < 5; i++)
  9.         {
  10.                 for (j = 0; j < 5; j++)
  11.                 {
  12.                         if ((*p)[j][i] == '\0')
  13.                         {
  14.                                 break;
  15.                         }
  16.                         printf("%c ", (*p)[j][i]);
  17.                 }
  18.                 printf("\n");
  19.         }

  20.         return 0;
  21. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-11 19:47:15 | 显示全部楼层    本楼为最佳答案   
对于这个程序,确实没问题,因为array中的字符串一个比一个短
但是这样的写法确实是有问题的,如果换一下array中字符串的顺序就出问题了
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         //char *array[5] = {"FishC", "Five", "Star", "Good", "Wow"};
  5.         char *array[5] = {"Wow", "Good", "Star", "Five", "FishC"};
  6.         char *(*p)[5] = &array;
  7.         int i, j;

  8.         for (i = 0; i < 5; i++)
  9.         {
  10.                 for (j = 0; j < 5; j++)
  11.                 {
  12.                         if ((*p)[j][i] == '\0')
  13.                         {
  14.                                 break;
  15.                         }
  16.                         printf("%c ", (*p)[j][i]);
  17.                 }
  18.                 printf("\n");
  19.         }

  20.         return 0;
  21. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-9-11 19:50:54 | 显示全部楼层
本帖最后由 jhq999 于 2022-9-11 19:52 编辑

楼上正解
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 22:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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