gpt4 book ai didi

c - C 中奇怪的矩阵行为

转载 作者:行者123 更新时间:2023-11-30 15:02:59 28 4
gpt4 key购买 nike

我的 C 程序使用 2 int 矩阵。第一个矩阵是 n x n 并按如下方式分配:

void alocar_matriz(int ***matriz)
{
int i;
if((*matriz = (int**)calloc(n,sizeof(int*)))==NULL)
{
printf("\n\a\t\tERRO: NAO FOI POSSIVEL ALOCAR MEMORIA!!\n");
exit(1);
}
for(i=0;i<n;i++)
{
if(((*matriz)[i] = (int*)calloc(n,sizeof(int)))==NULL)
{
printf("\n\a\t\tERRO: NAO FOI POSSIVEL ALOCAR MEMORIA!!\n");
exit(1);
}
}
}

第二个是三角形劣矩阵,分配方式如下:

void alocar_matriz_mao_dupla(int ***matriz)
{
int i;
if((*matriz = (int**)calloc(n,sizeof(int*)))==NULL)
{
printf("\n\a\t\tERRO: NAO FOI POSSIVEL ALOCAR MEMORIA!!\n");
exit(1);
}
for(i=0;i<n;i++)
{
if(((*matriz)[i] = (int*)calloc(i+1,sizeof(int)))==NULL)
{
printf("\n\a\t\tERRO: NAO FOI POSSIVEL ALOCAR MEMORIA!!\n");
exit(1);
}
}
}

有了第一个矩阵数据,我有一个修改第二个(三角形)矩阵值的函数(其中“mat”是第一个 nxn 矩阵,“mao_dupla”是第二个三角形矩阵):

void verifica_mao_dupla(int **mat, int **mao_dupla)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i!=j)
{
if(mat[i][j]==1 && mat[j][i]==1)
mao_dupla[j][i] = 1;
}
}
}
}

所以我的问题是:函数 void verifica_mao_dupla(int **mat, int **mao_dupla) 应该只修改三角形矩阵“mao_dupla”的元素,同时也在修改矩阵“mat”元素。这是不应该发生的。我不知道是什么错误。请帮忙

最佳答案

有时修改mao_dupla[j][i]时,j会小于i。在这种情况下,写入超出了 mao_dupla[j] 的范围,从而产生未定义的行为。此外,您所做的工作超出了您需要做的工作。

您应该能够简单地通过改进对数组索引的处理和更改循环限制来解决问题:

void verifica_mao_dupla(int **mat, int **mao_dupla) {
for(int i = 1; i < n; i++) { // no need for an i == 0 iteration
for(int j = 0; j < i; j++) { // fixed loop bounds
// note: j cannot be equal to i here
if(mat[i][j]==1 && mat[j][i]==1) {
mao_dupla[i][j] = 1; // swapped index order
}
}
}
}

关于c - C 中奇怪的矩阵行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40896687/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com