【问题标题】:C array of structs giving strange behaviour给出奇怪行为的 C 结构数组
【发布时间】:2021-05-01 01:35:24
【问题描述】:

我是 C 编程新手,所以我开始制作一个简单的项目。我对以下代码有疑问,这似乎与在 C 中管理内存的方式有关,但我不确定。 我有一个 1280x720 的粒子数组,我用零和“无”填充。然后我在 (1,1) 处填写一个条目。最后我打印出所有不是“无”的“粒子”。奇怪的行为来自这样一个事实,当我这样做时,我得到了以下输出: 721 0 sand 1 1 sand 显然第二个值应该存在,但第一个值不应该存在。我尝试了不同的 x,y 值,它总是将 720 添加到 x,并从 y 中减去 1。

#include <stdio.h>
#include <string.h>

typedef struct {
  char name[10];
  int colour;
} Particle;

Particle particles[1280][720];

void main() {
  //Fill in the 1280 x 720 array with 0's and None
  for (int y=0; y<720; y++) {
    for (int x=0; x<1280; x++) {
      particles[y][x].colour = 0x000000;
      strcpy(particles[y][x].name, "none");
    }
  }

  //Copy in 1 pixel of sand
  strcpy(particles[1][1].name, "sand");
  particles[1][1].colour = 0xFFFF00;

  //Print out all the pixels that are not none, which should
  //just print out a single pixel at (1,1)
  for (int y=0; y<720; y++) {
    for (int x=0; x<1280; x++) {
      if (strcmp("none",particles[y][x].name) != 0) {
        printf("%d %d %s\n",x,y,particles[y][x].name);
      }
    }
  }
}

抱歉,这是一个简单的问题。提前致谢。

【问题讨论】:

    标签: c object memory-management


    【解决方案1】:

    数组particles 的每一行只有720 个元素,所以particles[y][x]x &gt;= 720 时超出范围。访问超出范围的元素会调用未定义的行为

    引用N1570J.2 未定义行为:

    一个数组下标超出范围,即使一个对象显然可以用 给定下标(如左值表达式 a[1][7] 给定声明 int a[4][5]) (6.5.6)。

    分配足够的元素以避免缓冲区溢出。看来你应该使用

    Particle particles[720][1280];
    

    而不是

    Particle particles[1280][720];
    

    最好将宽度和高度定义为宏以避免拼写错误:

    #include <stdio.h>
    #include <string.h>
    
    #define WIDTH 1280
    #define HEIGHT 720
    
    typedef struct {
      char name[10];
      int colour;
    } Particle;
    
    Particle particles[HEIGHT][WIDTH];
    
    void main() {
      //Fill in the WIDTH x HEIGHT array with 0's and None
      for (int y=0; y<HEIGHT; y++) {
        for (int x=0; x<WIDTH; x++) {
          particles[y][x].colour = 0x000000;
          strcpy(particles[y][x].name, "none");
        }
      }
    
      //Copy in 1 pixel of sand
      strcpy(particles[1][1].name, "sand");
      particles[1][1].colour = 0xFFFF00;
    
      //Print out all the pixels that are not none, which should
      //just print out a single pixel at (1,1)
      for (int y=0; y<HEIGHT; y++) {
        for (int x=0; x<WIDTH; x++) {
          if (strcmp("none",particles[y][x].name) != 0) {
            printf("%d %d %s\n",x,y,particles[y][x].name);
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多