指针问题,我想知道我哪错了

来源:百度知道 编辑:UC知道 时间:2024/06/18 14:37:17
void main()
{
int i,j;
int cands=10, Row=10;
int **a;
int maxa,maxi,maxj;

a = (int **) malloc(sizeof(int *) * Row);
for (j=0;j<Row;j++)
{
a[j] = (int *) malloc(sizeof(int) * cands);
}
for (j=0;j<Row;j++) for (i=0;i<cands;i++)
{
a[j][i] = (j+1)*100 + i;
}

for (j=0;j<Row;j++){
for (i=0;i<cands;i++) printf("%3d ",**(a+j)+i);
printf("\n");
}

maxa= **a; maxi=maxj=0;
for (j=0;j<Row;j++)
for (i=0;i<cands;i++)
{
if (**(a+j)+i > maxa) {maxi = i; maxi=j,maxa = **(a+j)+i; };

}

printf("the largest value is %d%d%d\n",maxi,maxj, **(a+maxi)+maxj );

}
发错了,应该是这个
#define A 2
#define B 3
int s(int [][B],int);
int main()
{
int max_value;
int s[A][B]={{3,2,1},{7,8,9}};
max_value=max(s,A);
printf("max va

你主要错在指针的使用和临时变量的生命有效期的理解上。

这道程序的目的是返回二位数组的最大元素。
首先在S这个函数,除了数组操作外,并没有必要进行传址操作。所以没有必要使用*max,这个int指针,直接使用int max就行。

下面说一下你这个程序错在哪里,
在S这个函数中,int *max是一个临时变量,它的生命周期就在S这个函数内。
也就是说,这个临时变量的生命周期是:
在S这个函数中,从*max声明后,到return完毕。
而你的S函数的return实际上是一个传址处理,将max这个地址作为参数,
传递给了调用元。
但是由于S函数return完毕后,相关的临时变量被释放,max指针就变成了野指针。

当main函数中,max()函数使用该参数时,就发生了指针指向野地址的错误。

指针没啥问题,你调用的函数错了
int s1[A][B]={{3,2,1},{7,8,9}};
max_value=s(s1,A);
改成s,另外数组名不 要跟函数名同名