- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写的 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 *. */
当然,bb
和cc
的分配也是一样。
注意使用 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/
这个问题在这里已经有了答案: Multiple glibc libraries on a single host (11 个回答) 5年前关闭。 有没有办法在本地文件夹中安装新版本的 GLIBC?我将
这个问题在这里已经有了答案: Deploying Yesod to Heroku, can't build statically (4 个回答) 1年前关闭。 我有两台机器 RHEL 4机 RHEL
我在 C 启动时读取 article ,它指的是函数 __libc_csu_init 。谁能告诉我CSU代表什么? 最佳答案 我在 libc p 中找到了对“ C s tart u p”的引用。 这远
我正在使用 AlpineLinux(安装在我的计算机上,而不是安装在 docker 中)并且我正在尝试使用依赖于 glibc 的共享库。 由于 Glibc 没有集成到这个发行版中,我看到开发了一个替代
所以我正在玩 Alpine Linux,它使用 musl 与 glibc。 我发现由于这个选择,我无法运行 Oracle Java 或在 glibc 下构建的静态二进制文件。 musl 是否应该与更广
在构建 glibc 时,出现此错误。 *glibc/build/elf/dl-allobjs.os: file not recognized: File format not recognized c
我一直在寻找没有好的结果。 我想知道在文本中解释为 Malloc Maleficarum 或 Malloc Des-Malleficarum 的技术在 glibc 2.12.1 版本中是否有效。 在提
我在 CentOS 上安装 gcc 时遇到问题。 我的命令的输出sudo yum install gcc: Loaded plugins: fastestmirror Loading mirror s
我想下载gzip类型的mariadb,但是我发现它有很多文件可以下载,例如mariadb-10.2.6-linux-x86_64.tar.gz,mariadb-10.2.6-linux-glibc_2
我想尝试使用不同的 glibc 的 sin 函数。他们是否可以在不编译整个 glibc 的情况下使用不同 glibc 版本的 sin 函数? 我已经在我的虚拟 ubuntu 机器上下载了不同版本的 g
我要在超算中心的目录下安装一个软件,但是sudo,root,连apt-get,yum都不能用...这个软件需要glibc2.7,所以我得手动安装gcc和glibc(因为我无法更改内置 gcc 的路径来
我正在研究需要在多个不同的嵌入式平台上运行的 C 和 C++ 程序,为此我有交叉编译器,因此我可以在我的 x86 桌面上进行构建。 我在某些功能上遇到了一个可怕的问题,例如“strtod()”。这是我
我遇到了一个非常烦人的问题:我有一个程序,它在开始时创建一个线程,该线程将在执行期间启动其他内容(fork() 紧随其后的是 execve())。 这是我的程序达到(我认为)死锁时两个线程的 bt:
我刚刚发现,glibc 2.23 有一个关于 stdio 函数 fmemopen() 的错误,参见例如Using rewind() on a FILE* opened with fmemopen .
[root@localhost Keystone2]# sudo rpm -ivh glibc-2.3.4-2.9.audit.x86_64.rpm --nodeps --force warning:
从该系列中很容易找到如何使用 dlsym()和其他函数,但是在内部如何工作呢?是否可以编写自己的,容易实现的dlsym()? 我想知道是否有可能实现类似的行为,但在不将与-ldl链接的情况下实现(可以
嗨,我目前使用的是 ubuntu 9.10 和 glibc 版本 2.11.1-0,好吧,我正在做一个项目,我想用 glibc 的另一个版本(2.5-58)进行测试,我想知道以下与此相关的事情: 如何
我已经下载了glibc,这样我就可以修改它的代码然后使用它。所以只是为了玩玩它,我更改了 glibc 的 stdio-common 目录中的 printf 函数,以便它打印“你可以看到我吗?”。 in
我正在集群上的 conda 环境中部署 R 脚本。该脚本加载了一些需要 glibc 版本 >= 2.14 的包。虽然我的系统的 glibc 版本为 2.14,但集群的 glibc 版本为 2.12,我
所以。我有一个问题,我在一台机器上有两个版本的 GCC。 3.4.6 和 4.1 这是由于新软件的一些依赖性问题。 (需要 glibc 4.1) 当我将这个新软件与 4.1 库链接时,它链接得很好。但
我是一名优秀的程序员,十分优秀!