0

嗨,我正在尝试通过将所有 Malloc 调用(以及随后的 malloc 检查)移动到一个例程中来整理我的代码,如下所示:

int Malloc2D(int n, int m, double** array_ptr) {

array_ptr = (double**) malloc(n * sizeof(double*));
if (array_ptr == NULL) {
    std::cout << "ERROR! malloc failed on line " << __LINE__ << "..." << std::endl;
    return -1;
}
for (int i = 0; i < n; i++) {
    array_ptr[i] = (double*) malloc(m * sizeof(double));
    if (array_ptr[i] == NULL) {
        std::cout << "ERROR! malloc failed on line " << __LINE__ << "..." << std::endl;
        return -1;
    }
}

return 0;
}

但是在 main() 中,我会执行以下操作:

double** test;
if(Malloc2d(10, 20, test) == -1) return -1;

然后尝试在 main 中使用数组我得到一个段错误?有人有什么想法吗?杰克

4

4 回答 4

2

由于您传递的是 adouble **array_ptr它不会修改函数外部的指针。

在 C++ 中,您可以通过将其设为引用来修复它(并使用new,因为它是 C++)

int Malloc2D(int n, int m, double**& array_ptr) {

array_ptr = new double*[n]);
if (array_ptr == NULL) {
    std::cout << "ERROR! new failed on line " << __LINE__ << "..." << std::endl;
    return -1;
}
for (int i = 0; i < n; i++) {
    array_ptr[i] = new double[m];
    if (array_ptr[i] == NULL) {
        std::cout << "ERROR! new failed on line " << __LINE__ << "..." << std::endl;
        return -1;
    }
}

return 0;
}

或者,以 C 风格的方式,我们可以使用另一个指针间接寻址(&test在调用代码中使用来传递 的地址double ** test)。

int Malloc2D(int n, int m, double*** array_ptr) {

*array_ptr = (double**) malloc(n * sizeof(double*));
if (array_ptr == NULL) {
    std::cout << "ERROR! malloc failed on line " << __LINE__ << "..." << std::endl;
    return -1;
}
for (int i = 0; i < n; i++) {
    (*array_ptr)[i] = (double*) malloc(m * sizeof(double));
    if ((*array_ptr)[i] == NULL) {
        std::cout << "ERROR! malloc failed on line " << __LINE__ << "..." << std::endl;
        return -1;
    }
}

return 0;
}

或者您可以简单地首先返回指向数组的指针 - 但这需要对调用代码进行一些小的更改:

double** Malloc2D(int n, int m) {

double** array_ptr;
array_ptr = (double**) malloc(n * sizeof(double*));
if (array_ptr == NULL) {
    std::cout << "ERROR! malloc failed on line " << __LINE__ << "..." << std::endl;
    return NULL;
}
for (int i = 0; i < n; i++) {
    array_ptr[i] = (double*) malloc(m * sizeof(double));
    if (array_ptr[i] == NULL) {
        std::cout << "ERROR! malloc failed on line " << __LINE__ << "..." << std::endl;
        return NULL;
    }
}

return array_ptr;
}
于 2013-07-02T16:59:34.803 回答
1

C 和 C++ 是按值传递的。因此,对函数内部
所做的更改在函数外部是不可见的。array_ptrMalloc2D

你想传递一个指针来测试,并修改它的值。
(这会导致三分球;令人困惑,但并非难以管理)

int Malloc2D(int n, int m, double*** pOutput)
{
    double** array_ptr
    array_ptr = (double**) malloc(n * sizeof(double*));
    if (array_ptr == NULL) {
        std::cout << "ERROR! malloc failed on line " << __LINE__ << "..." << std::endl;
        return -1;
    }
    for (int i = 0; i < n; i++) {
        array_ptr[i] = (double*) malloc(m * sizeof(double));
        if (array_ptr[i] == NULL) {
            std::cout << "ERROR! malloc failed on line " << __LINE__ << "..." << std::endl;
            return -1;
        }
    }

    *pOutput = array_ptr;
    return 0;
}

然后要使用该功能,请传递以下地址test

double** test;
if(Malloc2d(10, 20, &test) == -1) return -1;
于 2013-07-02T16:53:05.347 回答
1

您应该在double array_ptr. 在这里,它被复制了,并且只有副本被修改。

int Malloc2D(int n, int m, double** &array_ptr)
于 2013-07-02T16:55:07.750 回答
1

然后尝试在 main 中使用数组我得到一个段错误

问题是您没有修改array_ptr,因为它是按值传递的。一种可能的解决方案是通过引用传递它:

int Malloc2D(int n, int m, double** &array_ptr)
                                    ^
于 2013-07-02T16:55:52.640 回答