如何解决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 举报,一经查实,本站将立刻删除。