c - program.exe 编译后停止工作?

标签 c

我正在尝试编写代码来获取数组的补丁/子窗口。我写了下面的代码:

#include <stdio.h>

int patch(int a[5][5],int b[2][2],int r,int s)
{

int i=0,j=0,k;

if(r<=(5-2) && s<=(5-2)){

    for(r;r<(r+2);r++){
        for(s;s<(s+2);s++)
        {
            k = a[r][s];
            b[i][j] = k;

            i = i+1;
            j = j+1;

        }
    }
}
else
{printf("error!");}

return 0;
}

 int main()
{
int i,j,p,q;
int y[2][2] = {0};

int x[5][5] = {{95,155,200,200,232},
{100,155,232,95,150},
{200,45,200,135,123},
{232,150,85,69,180},
{95,95,200,123,45}
};

for(i=0;i<5;i++){
    for(j=0;j<5;j++){
        patch(x,y,i,j);
        for(p=0;p<2;p++){
            for(q=0;q<2;q++)
            {
                printf("y[%d][%d] = %d\n",p,q,y[p][q]);

            }
        }
    }
}


return 0;
}

但是,一旦我运行并编译此代码,我就会收到一条错误消息,指出 program.exe 已停止工作。我怎样才能解决这个问题 ?我需要为这种过程使用动态内存分配吗?或者有没有更简单的解决方案。

最佳答案

这一行:

for(r;r<(r+2);r++)

将运行比您预期的时间长得多的时间,从而导致缓冲区溢出。我想你的意思是在开始循环之前保存 r+2,然后与之进行比较。

此外,您将递增 ij 4 次,因此您也访问了 b 的边界。您需要重新考虑您的循环逻辑。也许应该是:

for (i = 0 ; i < 2; i++)
    for (j = 0; j < 2; j++) 
    {
        b[i][j] = a[r+i][s+j];
    }

关于c - program.exe 编译后停止工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22894718/

相关文章:

c - 程序试图实现的输出是什么

c - 如何在C中输入一行?

c - 如何正确地制定计数算法来从文件中计数?

c - 在 C 中处理结构数组

c - 二维数组函数仅传入 1 个值

c - 尝试用信号量编写一个简单的程序

c - 在 C 中实现 shellsort 算法

C:函数不向 main 返回值

c - 我的 sqlite 数据库文件的位置在哪里?

c - 使用 C 对棋盘上图 block 的位置进行排序