&引用;“检测到glibc”;c代码错误

&引用;“检测到glibc”;c代码错误,c,glibc,C,Glibc,我写的c代码有问题。它必须乘以给定维度的2个矩阵(填充0-9之间的随机整数)(mxn乘以nxm,结果为mxm矩阵)。矩阵由列填充。此外,我还必须输出整个程序的计算时间和进行计算的函数的执行时间 我在执行应用程序时遇到“glibc-detected”错误。我知道这是由于我的程序中的堆损坏,很可能是由于我无法找到错误所在而在malloc’ed数组上写入了外部内存 代码如下: #include <stdio.h> #include <stdlib.h> #include <

我写的c代码有问题。它必须乘以给定维度的2个矩阵(填充0-9之间的随机整数)(mxn乘以nxm,结果为mxm矩阵)。矩阵由列填充。此外,我还必须输出整个程序的计算时间和进行计算的函数的执行时间

我在执行应用程序时遇到“glibc-detected”错误。我知道这是由于我的程序中的堆损坏,很可能是由于我无法找到错误所在而在malloc’ed数组上写入了外部内存

代码如下:

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

#define A(i,j) aa[m*(j)+(i)]   //matrix by columns
#define B(i,j) bb[n*(j)+(i)]
#define C(i,j) cc[m*(j)+(i)]

void mmul (int m, int n, double *aa, double *bb, double *cc) {
   int i, j, k;
   for (i=0; i<m; i++)
      for (j=0; j<m; j++) {
         C(i,j)=0;
         for (k=0; k<n; k++)  C(i,j)+=A(i,k)*B(k,j);
      }
}

int main (int argc, char *argv[]) {
   clock_t exec_timer=clock(), comp_timer;
   srand(time(NULL)); //initialize random seed
   int m, n, i;
   double *aa, *bb, *cc, exec_time, comp_time;
   if (argc!=3
       || sscanf(argv[1], "%d", &m)!=1
       || sscanf(argv[2], "%d", &n)!=1
      ) {
      fprintf(stderr, "%s m n \n", argv[0]);
      return -1;
   }
/* malloc memory */
   aa=malloc(m*n*sizeof(int));  //integer matrix
   bb=malloc(n*m*sizeof(int));
   cc=malloc(m*m*sizeof(int));

/* fill matrix */
   for (i=0; i<m*n; i++) aa[i]=rand()%10;   //fill with random integers 0-9
   for (i=0; i<n*m; i++) bb[i]=rand()%10;   
/* compute product */
   comp_timer=clock();
   mmul(m,n,aa,bb,cc);
   comp_time=(double) (clock() - comp_timer) / CLOCKS_PER_SEC;
/* write output */
   for (i=0; i<m*m; i++) printf("%i\n",cc[i]);   
/* finishing */  
   free(aa); free(bb); free(cc);
   exec_time=(double) (clock() - exec_timer) / CLOCKS_PER_SEC;
   printf("exec time = %.3f, comp = %.3f\n", exec_time, comp_time);
   return 0;
}

#undef C
#undef B
#undef A
#包括
#包括
#包括
#按列定义(i,j)aa[m*(j)+(i)]//矩阵
#定义B(i,j)bb[n*(j)+(i)]
#定义C(i,j)cc[m*(j)+(i)]
无效mmul(整数m,整数n,双*aa,双*bb,双*cc){
int i,j,k;

对于(i=0;i嗯,是的,我能看到问题

您使用的是
double
数组,但您的分配代码使用
int
。由于通常
double
的大小是
int
的两倍,这会导致大量缓冲区溢出,破坏随机内存

基本上,这是:

aa=malloc(m*n*sizeof(int));  //integer matrix
他在撒谎。:)应该是:

aa = malloc(m * n * sizeof *aa);   /* Not an integer matrix! aa is double *. */
当然,
bb
cc
的分配也是如此

注意使用
sizeof*aa
(意思是“指针指向的值的大小
aa
”)来消除引入此错误的风险,即不手动重复该类型,而是将其“锁定”到实际指针,从而使代码更安全

作为一个小提示,与问题无关,您应该对
mmul()
的只读参数使用
const
,如下所示:

void mmul (int m, int n, const double *aa, const double *bb, double *cc)

这会立即让我们清楚哪些指针是输入,哪些是输出。这也可以帮助编译器生成更好的代码,但主要优点是它可以更清楚地传达您的意思。

是的,我可以看到问题所在

您使用的是
double
数组,但您的分配代码使用
int
。由于通常
double
的大小是
int
的两倍,这会导致大量缓冲区溢出,破坏随机内存

基本上,这是:

aa=malloc(m*n*sizeof(int));  //integer matrix
他在撒谎。:)应该是:

aa = malloc(m * n * sizeof *aa);   /* Not an integer matrix! aa is double *. */
当然,
bb
cc
的分配也是如此

注意使用
sizeof*aa
(意思是“指针指向的值的大小
aa
”)来消除引入此错误的风险,即不手动重复该类型,而是将其“锁定”到实际指针,从而使代码更安全

作为一个小提示,与问题无关,您应该对
mmul()
的只读参数使用
const
,如下所示:

void mmul (int m, int n, const double *aa, const double *bb, double *cc)

这会立即清楚地表明哪些指针是输入,哪些是输出。这也可以帮助编译器生成更好的代码,但主要优点是它可以更清楚地传达您的意思。

请指定完整的错误表,例如free():无效的下一个大小(fast):0x097a9008。请指定完整的错误表,例如free():无效的下一个大小(fast):0x097a9008.谢谢。我只是重用了旧代码中的那部分代码,没有注意到它们被定义为double,在重新读取时也找不到。谢谢。我只是重用了旧代码中的那部分代码,没有注意到它们被定义为double,在重新读取时也找不到。