#include<stdio.h>
#include<conio.h>
{
int mat[3][3]={{0,2,3},{4,9,5},{0,1,8}};
int i,j,c;
int x=0;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(mat[i][j]==0)
c++;
int col[c],row[c];
x=0;
for(i=0;i<3;i++)
{for(j=0;j<3;j++,x++)
{
if(mat[i][j]==0)
{
col[x]=j;
row[x]=i;
}
}}
for(x=0;x<c;x++)
{
for(j=0;j<3;j++)
{
mat[row[x]][j]=0;mat[j][col[x]]=0;
}
}
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%d\t",mat[i][j]);
}
printf("\n");
}
getch();
return 0;
}
我在上面的代码中做的是我存储零的位置并将其存储在数组中。 现在我使用这些位置将零值的行和列更改为零。 在执行时我遇到了分段错误。可能有人指出我的错误。
答案 0 :(得分:1)
除了用于定义数组大小的未初始化c
之外,您还需要在存储每对索引后递增x
。从,x++
循环语句中取出for
,就会出现错误(因为您可能找不到0
值。)
因此,无论是否将索引值写入数组,x
都会递增。如果您不这样做,col[]
和row[]
的这些数组元素都是未经授权的。因此,当您稍后使用它们进行索引时,您将使用未初始化的值来获取未定义的行为,这些值很可能超出了它们正在编制索引的数组。
请记住:您必须专门初始化所有局部变量。
答案 1 :(得分:0)
int i,j,c=0;
for(j=0;j<3;j++) { if(mat[i][j]==0) { col[x]=j; row[x]=i; x++; } }
虽然这不是最有效的解决方案,但上述更改应执行所需的任务。