C语言中数组的问题

南宫绝峰 2012-10-17 09:44:32
写了一个矩阵乘法的程序,运行时出现错误。还望高手给予解答


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
*【功能说明】:普通的矩阵乘法
*【函数参数】:数组arr_A[len_i][len_j]、 arr_B[len_j][len_k]
*【函数输出】:数组arr_C的地址
*/
int **Matrix_Common (int **arr_A, int **arr_B, int len_i, int len_j, int len_k)
{
int **arr_C = NULL;
for(int i = 0; i<len_i; i++)
for(int k = 0; k<len_k; k++)
for(int j = 0; j<len_j; j++)
arr_C[i][k] += arr_A[i][j] * arr_B[j][k];
printf ("4***********\n");
return arr_C ;
}

int main()
{
// int arr_A[4][4] = {{1,0,2,1}, {4,1,1,0}, {0,1,3,0}, {5,0,2,1}};
// int arr_B[4][4] = {{0,1,0,1}, {2,1,0,4}, {2,0,1,1}, {1,3,5,0}};
//
int arr_A[2][3] = {{1,2,3}, {4,5,6}};
int arr_B[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};

int **arr_C = Matrix_Common ((int **)arr_A, (int **)arr_B, 2, 3, 4);

for(int i = 0; i<2; i++)
{
for(int j = 0; j<4; j++)
printf("%5d", arr_C[i][j]);
printf("\n");
}
return 0;
}

...全文
199 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
罗小城 2012-10-20
  • 打赏
  • 举报
回复
关于二维数组名传参,楼主可以参考一下这篇文章:
http://www.cnblogs.com/yangxi/archive/2012/03/22/2411452.html
南宫绝峰 2012-10-17
  • 打赏
  • 举报
回复
通过上面几位的提示,以及网上查了一下资料,对源程序进行了以下修改。但是运行依旧越界。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
*【功能说明】:普通的矩阵乘法
*【函数参数】:数组arr_A[len_i][len_j]、 arr_B[len_j][len_k]、arr_C[len_i][len_k]
*【函数输出】:无
*/

void Matrix_Common (int **arr_A, int **arr_B, int **arr_C, int len_i, int len_j, int len_k)
{
int i = 0;
int j = 0;
int k = 0;
for(i = 0; i<len_i; i++)
for(k = 0; k<len_k; k++)
for(j = 0; j<len_j; j++)
arr_C[i][k] += arr_A[i][j] * arr_B[j][k];
}

int main()
{

// int arr_A[4][4] = {{1,0,2,1}, {4,1,1,0}, {0,1,3,0}, {5,0,2,1}};
// int arr_B[4][4] = {{0,1,0,1}, {2,1,0,4}, {2,0,1,1}, {1,3,5,0}};

int arr_A[2][3] = {{1,2,3}, {4,5,6}};
int arr_B[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
int arr_C[2][4];
Matrix_Common ((int **)arr_A, (int **)arr_B, (int **)arr_C, 2, 3, 4);

for(int i = 0; i<2; i++)
{
for(int j = 0; j<4; j++)
printf("%5d", arr_C[i][j]);
printf("\n");
}
return 0;
}

mujiok2003 2012-10-17
  • 打赏
  • 举报
回复
未经调试


/*
*【功能说明】:普通的矩阵乘法
*【函数参数】:数组arr_A[len_i][len_j]、 arr_B[len_j][len_k]
*【函数输出】:数组arr_C的地址
*/
int **Matrix_Common (int **arr_A, int **arr_B, int len_i, int len_j, int len_k, int* arr_C[])
{
//int **arr_C = NULL;
for(int i = 0; i<len_i; i++)
for(int k = 0; k<len_k; k++)
for(int j = 0; j<len_j; j++)
arr_C[i][k] += arr_A[i][j] * arr_B[j][k];
printf ("4***********\n");
return arr_C ;
}

int main()
{
// int arr_A[4][4] = {{1,0,2,1}, {4,1,1,0}, {0,1,3,0}, {5,0,2,1}};
// int arr_B[4][4] = {{0,1,0,1}, {2,1,0,4}, {2,0,1,1}, {1,3,5,0}};
//
int arr_A[2][3] = {{1,2,3}, {4,5,6}};
int arr_B[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
int arr_C[2][4];

int **arr_C = Matrix_Common ((int **)arr_A, (int **)arr_B, 2, 3, 4, arr_C);

for(int i = 0; i<2; i++)
{
for(int j = 0; j<4; j++)
printf("%5d", arr_C[i][j]);
printf("\n");
}
return 0;
}
xiaoxiao8310 2012-10-17
  • 打赏
  • 举报
回复
int **arr_C = NULL;
一个NULL指针,后面arr_C[i][k] += arr_A[i][j] * arr_B[j][k]; 直接赋值.
需分配内存先.结算出其大小,再memset.
mujiok2003 2012-10-17
  • 打赏
  • 举报
回复

arr_C[i][k] += arr_A[i][j] * arr_B[j][k]; //acc_C = NULL,acc_C[i][j]越界了,需要分配空间。
南宫绝峰 2012-10-17
  • 打赏
  • 举报
回复
Matrix_Common函数中的printf ("3***********\n");等是当时调试所用,与程序无关
赵4老师 2012-10-17
  • 打赏
  • 举报
回复
模版是语法糖。
南宫绝峰 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

用数组指针。

C/C++ code

#include <cstdio>

template<typename T, size_t I, size_t J, size_t K>
void Matrix_Production (T (*arr_A)[I][J], T (*arr_B)[J][K], T (*arr_C)[I][K])
{
size_t i = 0, j = 0,……
[/Quote]
很想知道template<typename T, size_t I, size_t J, size_t K>这块的具体含义以及与下面调用的联系。查了一下模版相关内容,没有看到类似的用法。希望给一下解答或链接。
赵4老师 2012-10-17
  • 打赏
  • 举报
回复
仅供参考
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
int **p;
int i,j;
void main() {
p=(int **)malloc(4*sizeof(int *));
if (NULL==p) return;
for (i=0;i<4;i++) {
p[i]=(int *)malloc(5*sizeof(int));
if (NULL==p[i]) return;
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
p[i][j]=i*5+j;
}
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
printf(" %2d",p[i][j]);
}
printf("\n");
}
for (i=0;i<4;i++) {
free(p[i]);
}
free(p);
}
// 0 1 2 3 4
// 5 6 7 8 9
// 10 11 12 13 14
// 15 16 17 18 19
mujiok2003 2012-10-17
  • 打赏
  • 举报
回复
为什么不能用 int**来指向 int [2][3]?

int a[2][3] = {{1,2,3},{4,5,6}};
int **p = (int**)(a);

a[1][2]; //5
p[1]; //类型为int*,值2,假设sizeof(int) == sizeof(int*)
p[1][2]; //等价于*((int*)2), 当然访问了无效的地址
//可见 a[1][2]和p[1][2]不等价
mujiok2003 2012-10-17
  • 打赏
  • 举报
回复
用数组指针。


#include <cstdio>

template<typename T, size_t I, size_t J, size_t K>
void Matrix_Production (T (*arr_A)[I][J], T (*arr_B)[J][K], T (*arr_C)[I][K])
{
size_t i = 0, j = 0, k = 0;
for(i = 0; i< I; i++)
for(k = 0; k<K; k++)
for(j = 0; j< J; j++)
(*arr_C)[i][k] += (*arr_A)[i][j] * (*arr_B)[j][k];
}

int main()
{

int arr_A[2][3] = {
{1,2,3},
{4,5,6}
};
int arr_B[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
int arr_C[2][4]= {{0}};

Matrix_Production (&arr_A, &arr_B, &arr_C);

for(int i = 0; i<2; i++)
{
for(int j = 0; j<4; j++)
printf("%5d", arr_C[i][j]);
printf("\n");
}
return 0;
}
mujiok2003 2012-10-17
  • 打赏
  • 举报
回复
void Matrix_Common (int **arr_A, int **arr_B, int **arr_C, int len_i, int len_j, int len_k)  
{
/**A = I x J, B = J x K , C = I*K **/
int ia, ic;
int ja, jb;
int kb, kc;
for(ic = 0; ic < len_i; ++ic)
{
for( kc= 0; kc < len_k; ++kc)
{
arr_C[ic][kc] = 0;
for(ia = ic, kb = kc, ja = 0, jb = 0; ja < len_j; ++ja,++jb)
{
arr_C[ic][kc] += arr_A[ia][ja] * arr_B[jb][kb];
}
}
}
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧