【发布时间】:2016-06-02 20:17:05
【问题描述】:
我正在编写一个代码,要求用户输入 2 个矩阵的行数和列数,然后再要求用户输入其元素。
在获取矩阵元素的用户输入之后。函数matadd被调用,它接收数组变量a[20][20]的地址,b[20][20]包含第一个和第二个矩阵的元素,变量m的地址,n包含没有。行和列,数组变量s[20][20] 的地址,它将存储两个矩阵的和。
matadd功能码:
int matadd(int *(h)[20], int *(k)[20], int *u, int *l,int *(m)[20])
{
//VARIABLE-DECLARATION
int i = 0, j = 0;
for (i = 0; i < *u; i++)
{
for (j = 0; j < *l; j++)
{
*(*(m + i) + j) = *(*(h + i) + j) + *(*(k + i) + j);
}
}
printf("The Addition of above two given matrices is given below :\n");
printf("-- --\n");
for (i = 0; i < *u; i++)
{
for (j = 0; j < *l; j++)
{
printf("|");
for (j = 0; j < *l; j++)
{
printf("%4d", *(*(m + i) + j));
}
printf(" | ");
printf("\n");
}
}
printf("-- --\n");
return(m);
}
问题出在*(*(m + i) + j) = *(*(h + i) + j) + *(*(k + i) + j);这行代码,它必须在指针变量m内一一分配附加值。
但是程序停在那里并给我错误:
在 mATRIX_pROTO.exe 中的 0x00C124B9 处引发异常:0xC0000005:访问 违规读取位置0x00000001。
如果有这个异常的处理程序,程序可能是安全的 继续。
找不到代码有什么问题。我正在使用 Visual Studio 2015 来调试我的代码。
任何帮助将不胜感激。
这是我的代码:
//CONSTANT-VARIABLE
#define MAX 1000
//USER-DEFINED FUCNTION
int matadd(int *h, int *k, int *u, int *l,int *(m)[20]);
char xgets(char *line, int size, FILE *stdi);
void header(void);
char xgets(char *line, int size, FILE *stdi) {
/* read a line from the user */
fgets(line, size, stdi);
/* strip the \n if present */
line[strcspn(line, "\n")] = '\0';
return line;
}
void header(void)
{
printf("*-*-*-*-*MATRIX_ADD_PTR*-*-*-*-*");
printf("\n\n");
}
//PROGRAM STARTS HERE
int main(void)
{
//FUCNTION CALL-OUT
header();
//VARIABLE-DECLARATION
int a[20][20] = { { 0 } }, b[20][20] = { { 0 } }, c[20][20] = { { 0 } },s[20][20] = { {0} };
int i = 0, j = 0;
int m = 0, n = 0, q = 0, w = 0;
int line[MAX] = { 0 };
printf("Type Same Number of ROWs And COLUMNs for Both Matrx \n\n");
printf("Enter the No. of ROWs needed in First Matrix : ");
xgets(line, sizeof(line), stdin);
sscanf_s(line, "%d", &m);
printf("\n");
printf("Enter the No. of COLUMNs needed in First Matrix : ");
xgets(line, sizeof(line), stdin);
sscanf_s(line, "%d", &n);
printf("\n");
printf("Enter the Elements for 1st ROW then 2nd and So on for First Matrix : \n");
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
xgets(line, sizeof(line), stdin);
sscanf_s(line, "%d", &a[i][j]);
}
}
printf("\n");
printf("Enter the No. of ROWs needed in Second Matrix : ");
xgets(line, sizeof(line), stdin);
sscanf_s(line, "%d", &q);
printf("\n");
printf("Enter the No. of COLUMNs needed in Second Matrix : ");
xgets(line, sizeof(line), stdin);
sscanf_s(line, "%d", &w);
printf("\n");
printf("Enter the Elements for 1st ROW then 2nd and So on for Second Matrix : \n");
for (i = 0; i < q; i++)
{
for (j = 0; j < w; j++)
{
xgets(line, sizeof(line), stdin);
sscanf_s(line, "%d", &b[i][j]);
}
}
//OUTPUT OF ENTERED MATRIX
printf("First Matrix : \n\n");
printf("-- --\n");
for (i = 0; i < m; i++)
{
printf("|");
for (j = 0; j < n; j++)
{
printf("%3d", a[i][j]);
}
printf(" | ");
printf("\n");
}
printf("-- --\n\n\n");
printf("Second Matrix : \n\n");
printf("-- --\n");
for (i = 0;i < q;i++)
{
printf("|");
for (j = 0; j < q; j++)
{
printf("%3d", b[i][j]);
}
printf(" | ");
printf("\n");
}
printf("-- --\n\n\n");
//FUCNTION CALL-OUT
matadd(a, b, &m, &n, s);
//TERMINAL-PAUSE
system("pause");
}
int matadd(int *(h)[20], int *(k)[20], int *u, int *l,int *(m)[20])
{
//VARIABLE-DECLARATION
int i = 0, j = 0;
for (i = 0; i < *u; i++)
{
for (j = 0; j < *l; j++)
{
*(*(m + i) + j) = *(*(h + i) + j) + *(*(k + i) + j);
}
}
printf("The Addition of above two given matrices is given below :\n");
printf("-- --\n");
for (i = 0; i < *u; i++)
{
for (j = 0; j < *l; j++)
{
printf("|");
for (j = 0; j < *l; j++)
{
printf("%4d", *(*(m + i) + j));
}
printf(" | ");
printf("\n");
}
}
printf("-- --\n");
return(m);
}
【问题讨论】:
-
int *(h)[20]等是 no 二维数组(又名矩阵)。它衰减为指向指针的指针,该指针不能是二维数组。也许你的意思是int (*h)[20]可以用于二维数组。也不要使用幻数。一旦你的代码增长,它们最终会导致错误。 -
1:名称。您的。变量。和。参数。 2:你的函数原型和它的定义不匹配。
-
代码甚至无法编译,
xgets应该返回char,但尝试返回char *(行)。 -
@olaf 是的,我声明了它们,所以我可以将它们用于 2D 数组,我不会使用任何幻数来处理那个;)谢谢回复。
-
启用 all 警告,并将每一个警告都视为错误。你用的是哪个编译器?