我希望得到你的帮助,以了解并完成我的计划。
这就是我要做的事情:
“你必须执行以下程序: 第一。吸收二维整数arr [M] [N]。 M - 行数N - 列数。 (矩阵大小来自 用户) 二。程序使用辅助功能“shift”将矩阵的值移动到右边的一个位置,如图所示(2 输入而不是1,3而不是2,4而不是3,...而是20 19,第一名20)。 Shift必须编写一个函数并在样本矩阵循环中调用她三次。“
示例图片:
错误消息:
在尝试解决我放弃的问题后,我想得到你的帮助,以了解我的代码中的错误。 它是关于记忆的吗? 这是我的代码:
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#include "malloc.h"
void shift (int **arr,int rows,int cols);
void freemalloc ( int **arr,int rows);
void main()
{
int **arr,cols,rows;
int i,j;
printf("please insert rows and columns of the matrix: ");
scanf_s("%d%d",&rows,&cols);
arr=(int **)malloc(rows*sizeof(int *));
for(i=0; i<rows; i++)
arr[i]=(int *)malloc(cols*sizeof(int));
for (i=0; i<rows; i++)
for (j=0; j<cols; j++)
{
printf("rows %d , cols %d :\n", i, j);
scanf_s("%d", &arr[i][j]);
}
shift (arr,rows,cols);
freemalloc (arr,rows);
system("pause");
return ;
}
void shift (int **arr,int rows,int cols)
{
int i,j,temp=0;
for(i=0; i<rows ; i++ )
for( j=0 ; j<cols ; j++);
{
temp=arr[i][j];
arr[i][j]=arr[i][cols-1];
arr[i][cols-1]=temp;
}
for(i=0; i<rows ; i++)
{
for(j=0; j<cols ; j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
}
void freemalloc ( int **arr,int rows)
{
int i;
for (i=0 ; i<rows ; i++)
{
free(arr[i]);
}
free(arr);
}
答案 0 :(得分:4)
我在一般评论中注意到了这一点,我将在此放大它。这是错误的,并且会导致未定义的行为:
for(i=0; i<rows ; i++ )
for( j=0 ; j<cols ; j++); // <<== this is wrong.
{
temp=arr[i][j];
arr[i][j]=arr[i][cols-1];
arr[i][cols-1]=temp;
}
那个尾随的分号是完全错误的。有了它,代码就会变成这样:
// A useless nested for loop that runs `i` to `rows` and `j to `cols`
for(i=0; i<rows ; i++ )
for( j=0 ; j<cols ; j++);
// Now `i=rows` and `j=cols`. then you do this
temp=arr[i][j];
arr[i][j]=arr[i][cols-1];
arr[i][cols-1]=temp;
你正在访问你不拥有的内存,因为arr
只能被[rows-1][cols-1]
索引。外面的任何东西都是未定义的行为。
<强>校正强>
for(i=0; i<rows ; i++ )
for( j=0 ; j<cols ; j++) // note: no semi-colon.
{
temp=arr[i][j];
arr[i][j]=arr[i][cols-1];
arr[i][cols-1]=temp;
}
通过删除分号修复代码,至少解决了部分问题。我不能代表其他问题。
最后,使您的编译器警告处于迂腐状态。任何配置了正确加强警告的合理编译器都会遇到此问题。
答案 1 :(得分:2)
错误已在另一个答案中指出,但让我给你另一个好建议:不要使用指针指针来表示多维数组。
此外, do NOT cast the return value of malloc()
。
这是你应该做的(应该做的):
int (*mat)[width] = malloc(height * sizeof(*mat));