c - 不同的写作,同样的事情:一个给出分段错误,另一个没有
问题描述
有什么理由会导致分段错误:
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
typedef uint8_t BYTE;
typedef struct
{
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
} __attribute__((__packed__))
RGBTRIPLE;
void edges(int height, int width, RGBTRIPLE image[height][width]) {
RGBTRIPLE original[height][width];
for(int i = 0; i < height; i++)
for(int j = 0; j < width; j++)
original[i][j] = image[i][j];
for(int i = 0; i < height; i++)
for(int j = 0; j < width; j++)
for(int k = i - 1; k < i + 2; k++)
for(int m = j - 1; m < j + 2; m++)
if(k < 0 || m < 0 || k == height || m == width) {
original[k][m].rgbtRed = 0;
original[k][m].rgbtGreen = 0;
original[k][m].rgbtBlue = 0;
}
}
与此相反?
if(k < 0 || m < 0 || k == height || m == width) {
original[k][m].rgbtRed = original[k][m].rgbtGreen = original[k][m].rgbtBlue = 0;
}
这是唯一的区别,但前者给出了分段错误,而后者没有。
如果重要的话,我正在使用 CS50 IDE。
我无法给出完整的上下文,因为代码有数百行,但本质上这只是在 bmp 图像的每个像素上重复。这只发生在大图像上,而小图像既不返回段错误。
解决方案
在 C 语言中,禁止访问 [0, N-1] 范围之外的大小为 N 的数组。在这两种情况下,您都在此范围之外访问,这就是您遇到分段错误的原因。
推荐阅读
- javascript - 如何使用 Vue 和 Axios 获取 JSON 数据
- sql-server - 通过在 Always on 可用性组节点上对 SQL 查询进行负载平衡来提高应用程序性能?
- .net-core - 如何在单个查询中在 Table1、Table2 和 Mapping_Table1_Table2 表中插入数据
- windows - 批量更改多个目录中mkv文件的标题
- javascript - 当带有 async fs.readdir 的递归函数完成执行时如何得到通知?
- mysql - mysql; 更新表字段的正确方法
- javascript - 找不到模块“反应”的声明文件
- c++ - 在 C++ 中初始化新分配的内存的最快方法是什么?
- pandas - 正则表达式的熊猫系列提取物
- java - java - 如何在Java中获得小时和分钟的时差/持续时间?