gpt4 book ai didi

c - C 代码 "glibc detected"错误

转载 作者:太空宇宙 更新时间:2023-11-04 01:33:19 29 4
gpt4 key购买 nike

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

我在执行应用程序时收到“检测到 glibc”错误。我确实知道这是由于我的程序中的堆损坏造成的,很可能是由于我无法找到错误所在而在 malloc 数组上写入了外部内存。

代码如下:

#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

任何人都可以看到我遗漏的问题吗?

最佳答案

嗯,是的,我能看出问题所在。

您正在使用 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 *. */

当然,bbcc的分配也是一样。

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

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

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

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

关于c - C 代码 "glibc detected"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19111167/

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