c++ - 尝试更改 void 函数中的指针时引发异常
问题描述
我正在尝试创建一个 void 函数,它会更改我传递的指针。该代码在其中一行上引发异常,我不知道为什么。难道我不能将数组作为指针传递然后在其上实现数学?我以为我释放了指针来修复它,但这似乎不起作用。
空功能:
#include <iostream>
using namespace std;
void* func2(int one, double *value1[], int two, double *value2[], double *final1) {
double testval;
double finalval = 0;
//double *final1;
double final = 0;
for (int i = 1; i < one; i++) {
for (int j = 1; j < two; j++) {
testval = *value1[i] * *value2[j]; //exception thrown (works up to this point)
finalval = testval + finalval;
}
final = finalval + final;
}
*final1 = final;
return 0;
}
主功能:
int main(){
double *array1 = new double[input1];
double *array2 = new double[input2];
//for loop that takes user input and fills in array1 and array2 with size and a list of values
...
double testval2;
func2(input1, &array1, input2, &array2, &testval2);
cout << testval2 << endl;
delete[] array1;
delete[] array2;
return 0;
我对指针比较陌生,所以如果代码有点文盲,我很抱歉。
解决方案
看起来您想将两个一维数组传递给func2()
.
一种方法是[]
从函数签名中删除
(int one, double *value1, int two, double *value2, double *final1)
在函数内,更改*value1[i]
为value1[i]
,同样为value2
。&
并在从 main() 调用函数时删除。
其他几个想法:
我不确定如何从您的代码中抛出异常。但是
*value1[i]
绝对是无效的内存访问,所以您可能看到的是分段错误消息。解决此类错误的一个有用工具是AddressSanitizer,通过编译在 clang 或 gcc 中启用-fsanitize=address
,或者如果您使用的是 Xcode,则有一个选项。另一个很棒的工具是valgrind。手动分配动态数组是使用 C++ 的一种非常类似于 C 的方式。在 C++ 中,将数组创建为
std::vector
对象是惯用的,它在底层以相同的方式工作(它也分配一个动态数组),但具有更方便的接口。特别是向量会自动清理自己,因此无需调用delete[]
,并且向量知道自己的大小,因此无需像动态数组那样将大小作为单独的参数传递。
编辑:这是一个说明,说明为什么原始代码能够编译但在运行时失败。
在函数签名中,both*
和[]
on的组合double *value1[]
产生value1
了一个指向 double 的指针,相当于double **value1
. 在 main() 中,array1
是一个双 *。调用函数时&array1
,获取该双精度*的地址,获得双精度**。所以类型匹配并且代码编译。
代码在运行时失败*value1[i]
。value1 是指向双精度数的指针,其中内部指针指向动态数组。所以我们的意图是(*value1)[i]
首先取消引用外部指针,然后下标到动态数组中。但是,在 C++ 中,下标 ( a[]
) 的运算符优先于取消引用 ( *a
),因此它按倒序读取*(value1[i])
。下标外部指针value1[i]
对于 nonzero 无效i
,从堆栈中的某处读取内存并任意将其解释为 double*。然后周围*( )
尝试取消引用这个被破坏的指针。机器的内存保护捕捉到这一点,操作系统发送一个“SIGSEGV”信号或类似的程序来杀死它。
推荐阅读
- javascript - 如何在数据库数据中的 dhtmlx 调度程序中显示事件
- python - 根据 Pandas 中的日期条件将一列的值替换为 NaN
- encryption - 如何加密极小的数据(2 - 4 个字节)?
- python - 无法理解这个递归函数
- react-native - 如何使用 .map() 呈现此 javascript 对象中的数据?
- java-8 - 将 macOS 更新到 Catalina 后,Play 框架无法正常工作
- python - 使用 python 对象创建一个 MatPlotLib
- data-structures - 在堆排序中插入/删除相同的元素
- php - 我的代码没有正确添加整数,我做错了什么
- android - 当源为空时如何在 exoplayer 中显示离线消息