gpt4 book ai didi

调用 malloc 似乎修改了不相关的数据

转载 作者:太空宇宙 更新时间:2023-11-04 07:36:18 25 4
gpt4 key购买 nike

顺便说一句,这是我第一次在论坛上发帖提问。我在实现算法时遇到问题,我已将其缩小到以下代码行:

int Jacobi( double** A, double* b, int n, double* x0,
double tol, int maxInt ) {
int i = 0;
int j = 0;
int done = 0;
int loopCount = 0;

/*previous x variable*/
double* xPrev = 0;

/*update information*/
double** T = 0;
double* c = 0;

/*initialize x previous to a very large value*/
--->xPrev = ( double* )malloc( sizeof( double ) * n );
for( i = 0; i < n; i++ ) {
xPrev[ i ] = 5000.0;
}
...
}

通过 gdb 检查,我发现箭头指向的那条线是导致问题的那条线。在执行该行之前,x0[ 1 ] = 1。之后,它以某种方式更改为 x0[ 1 ] =(我认为是最小 double 值的极小数字)。我不知道为什么会这样,或者怎么可能。有没有人有任何见解?

这是证明它的 gdb 运行:

(gdb) break 88
Breakpoint 1 at 0x804881f: file linsys.c, line 88.
(gdb) run
Starting program: /home/stu1/s11/gaw9451/Courses/AP/hw4/linsys_test

Breakpoint 1, Jacobi (A=0x804b008, b=0x804b048, n=2, x0=0x804b060,
tol=9.9999999999999998e-13, maxInt=8) at linsys.c:88
88 xPrev = ( double* )malloc( sizeof( double ) * n );
(gdb) display x0[ 1 ]
1: x0[ 1 ] = 1
(gdb) next
89 for( i = 0; i < n; i++ ) {
1: x0[ 1 ] = 5.3049894774131808e-313

在一个可能相关的注释中,当我在函数末尾释放变量 xPrev 时,我在运行时遇到错误。我不得不将其注释掉以查看程序的任何输出。

总结:有谁知道 malloc 如何在一个完全不同的变量字段中编辑数据?

提前致谢,凤心6

最佳答案

我很确定你搞砸了以前的 malloc,比如分配的比需要的少,现在 malloc 覆盖了不属于你的东西。

像这样想象malloc 内存。

   +-----------------------------------------------------+
|xxxxxxxxxx|!!!!!!!|??????????????????????????????????|
+-----------------------------------------------------+
  • X 区域代表您从 malloc
  • 请求的内容
  • ! 区域代表您写入的内容超过合法大小
  • ? 区域代表未使用的内存

现在,当您执行第二个 malloc 时,它会感觉完全有权放弃“您的”! 部分。

关于调用 malloc 似乎修改了不相关的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8597043/

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