微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C 结构数组给出奇怪的行为

如何解决C 结构数组给出奇怪的行为

我是 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);
      }
    }
  }
}

对不起,如果这是一个简单的问题。提前致谢。

解决方法

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

引用自 N1570 J.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);
      }
    }
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。