首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个二维数组的小程序发生错误,另请问关于程序调试技术

2012-04-12 
一个二维数组的小程序发生异常,另请教关于程序调试技术程序实现的功能是将某二维数组的每一行的最小的元素

一个二维数组的小程序发生异常,另请教关于程序调试技术
程序实现的功能是将某二维数组的每一行的最小的元素找出来,存放在res数组中。
下面是我的程序,编译通过,执行时发生:
est.exe 中的 0x00ef1401 处未处理的异常: 0xC0000005: 读取位置 0x00000001 时发生访问冲突

C/C++ code
#include <stdio.h>#include <string.h>void func(const int **array,const int M,const int N,int *res){    int i,j;    int mini;    /*int mini=array[0][0];*/    for(i=0;i<M;i++)    {        mini=**(array+i);        for(j=0;j<N;j++)            if(array[i][j]<mini)                mini = array[i][j];        *res++ = mini;    }    *res = '\0';}int main(/*int argc, char **argv*/){    const int array[2][4]={1,3,2,4,5,9,6,0};    int res[20];    int *p =res;    func((const int **)array,2,4,res);    while(*p++)        printf("res is %d ",*p);    /*printf("%d ",*(*(array+1)+2));*/    system("pause");    return 0;}


不知道哪里错了。另外请教关于程序调试的方法和技术,有没有什么好的资料和书籍推荐。谢谢

[解决办法]
vs2008.
F5 调试, F10下一步,F9设置一个断点,F11进入运行到的语句的函数.
在调试过程中按F5,直接跳到下一个断点处.
在debug模式下,还可以把光标移到 变量上面,显示变量的值.
[解决办法]
《windows高级调试》
[解决办法]
lz的程序应该这样改动一下.
void makeArray1(int***arry, int lenght, int len)
{
(*arry) = (int**)malloc(len*sizeof(int*));
for(int i = 0; i<len; i++)
{
(*arry)[i] = (int*)malloc(lenght*sizeof(int));
memset((*arry)[i], 0, lenght*sizeof(int));
}
}

void func(int **array,const int M,const int N,int *res)
{
int i,j;
int mini;

for(i=0;i<M;i++)
{
mini=**(array+i);
for(j=0;j<N;j++)
if(array[i][j]<mini)
mini = array[i][j];
*res++ = mini;
}
*res = '\0';
}
int _tmain(int argc, _TCHAR* argv[])
{
int ** array5 ; //这里不要用二维数组,应该用指针的指针.

makeArray1(&array5, 2, 4);
array5[0][0] = 1;
array5[0][1] = 3;
array5[0][2] = 2;
array5[0][3] = 4;
array5[1][0] = 5;
array5[1][1] = 9;
array5[1][2] = 6;
array5[1][3] = 0;

int res[20];
func(array5, 2, 4, res);

return 0;
}
我知道怎么改,但不知道为什么,我现在也在找二维数组和指针的指针的区别.
希望对你有帮助

[解决办法]
探讨
程序实现的功能是将某二维数组的每一行的最小的元素找出来,存放在res数组中。
下面是我的程序,编译通过,执行时发生:
est.exe 中的 0x00ef1401 处未处理的异常: 0xC0000005: 读取位置 0x00000001 时发生访问冲突


C/C++ code

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

void func(……

[解决办法]
调试掌握很简单的:我一般都是从头开始,就按step over 键,每按一下,就执行一步,但不进入函数。
要想进入函数,就按step into键,进入函数后再继续按step over键一步一步的执 行,遇到要输入时,就要输入数据,不然调试不能进行。
要想查看数组内容,按quickwatch,若用到递归,可按callstack键,观察函数的进栈情况。
 这些按钮都在在调试工具条上。调试工具条的显示:在菜单栏的空白处点击右键勾上。
找个小的错程序,尝试尝试,祝你好运。
[解决办法]
并不是说二维数组其实可以看着一级指针,二级指针是指向一级指针的一级指针,二者也不是不能转换。只是转换以后要注意。
void func(const int **array,const int M,const int N,int *res)
{
int i,j;
int mini;
/*int mini=array[0][0];*/
for(i=0;i<M;i++)
{
mini=**(array+i);//关键是这里出现问题
for(j=0;j<N;j++)
if(array[i][j]<mini)
mini = array[i][j];
*res++ = mini;

}
*res = '\0';
}

array其实现在是指向了数组的,*(array+i)这样就已经提取了数组的值1,但是再加一个提取符,ok现在提取地址为0x01里面的内容。这样当然出错,其实你可以用一级指针int (*array)[4].


希望对你有帮助吧。

热点排行