须弥芥子 发表于 2022-9-11 19:32:08

S1E23课后作业,关于越界访问

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

int main()
{
      char *array = {"FishC", "Five", "Star", "Good", "Wow"};
      char *(*p) = &array;
      int i, j;

      for (i = 0; i < 5; i++)
      {
                for (j = 0; j < 5; j++)
                {
                        if ((*p) == '\0')
                        {
                              break;
                        }
                        printf("%c ", (*p));
                }
                printf("\n");
      }

      return 0;
}

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

int main()
{
    char *array = {"FishC", "Five", "Star", "Good", "Wow"};
    char *(*p) = &array;
    int i, j;

    for (i = 0; i < 5; i++)
    {
      for (j = 0; j < 5; j++)
      {
            if ((*p) == '\0')
            {
                break;
            }
//            printf("%c ", (*p));
//          打印出下标
            printf("[%d][%d] ", j, i);
      }
      printf("\n");
    }

    return 0;
}
/*
输出结果:






Process finished with exit code 0
*/

为什么呢?

人造人 发表于 2022-9-11 19:47:15

对于这个程序,确实没问题,因为array中的字符串一个比一个短
但是这样的写法确实是有问题的,如果换一下array中字符串的顺序就出问题了
#include <stdio.h>

int main()
{
      //char *array = {"FishC", "Five", "Star", "Good", "Wow"};
      char *array = {"Wow", "Good", "Star", "Five", "FishC"};
      char *(*p) = &array;
      int i, j;

      for (i = 0; i < 5; i++)
      {
                for (j = 0; j < 5; j++)
                {
                        if ((*p) == '\0')
                        {
                              break;
                        }
                        printf("%c ", (*p));
                }
                printf("\n");
      }

      return 0;
}

jhq999 发表于 2022-9-11 19:50:54

本帖最后由 jhq999 于 2022-9-11 19:52 编辑

楼上正解
页: [1]
查看完整版本: S1E23课后作业,关于越界访问