【问题标题】:Why did my array get transposed?为什么我的数组被转置了?
【发布时间】:2018-10-12 22:33:50
【问题描述】:

我想声明一个二维数组 (double** data)。我想通过地址将其传递给辅助函数;所以我通过&data 并且辅助函数有参数double*** d

通过这种方式,我在main函数中用于二维数组的索引不再起作用了。

测试代码:

#include <stdio.h>
#include <stdlib.h>

void helperfunction(double*** data, int n, int c) {

    printf("\nIn helper function\n");

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < c; j++) {
            printf("(%i %i %lf) ", i, j, *data[i][j]);
        }
        printf("\n");
    }

}

int main(int argc, char **argv) {

    int n = 4; //number of rows
    int c = 4; //number of columns

    double count = 0.0;

    double** data = malloc(n * sizeof(double*));

    for (int i = 0; i < n; i++) {
        double* row = malloc(c * sizeof(double));
        for (int j = 0; j < c; j++) {
            row[j] = count;
            count += 1.2;
        }
        data[i] = row;
    }

    printf("In main function\n");

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < c; j++) {
            printf("(%i %i %lf) ", i, j, data[i][j]);
        }
        printf("\n");
    }

    helperfunction(&data, n, c);

    return 0;
}

输出:

In main function
(0 0 0.000000) (0 1 1.200000) (0 2 2.400000) (0 3 3.600000) 
(1 0 4.800000) (1 1 6.000000) (1 2 7.200000) (1 3 8.400000) 
(2 0 9.600000) (2 1 10.800000) (2 2 12.000000) (2 3 13.200000) 
(3 0 14.400000) (3 1 15.600000) (3 2 16.800000) (3 3 18.000000) 

In helper function
(0 0 0.000000) (0 1 4.800000) (0 2 9.600000) (0 3 14.400000) 
Segmentation fault (core dumped)

显然,当我在辅助函数中引用地址 (*data[i][j]) 时,索引出现问题。这是什么原因造成的?

【问题讨论】:

  • 优先级。 [] 的优先级高于 *。使用(*data)[i][j]
  • 注意:您不是在创建二维数组。您创建了一个指向一维数组的一维数组。这些是非常不同的。

标签: c arrays segmentation-fault pass-by-pointer


【解决方案1】:

*data[i][j] 不会按照你的想法去做。它相当于*(data[i][j])。您的选择是:

  1. 改用(*data)[i][j],或者

  2. 传递data(而不是&amp;data)并使用data[i][j],因为这里不需要传递三重指针。

【讨论】:

  • 谢谢。这是一个最小的例子,所以实际实现需要三重指针。
【解决方案2】:

抱歉,刚刚想通了。使用[] 的取消引用发生在使用* 的取消引用之前。因此,当 i != 0 时调用*data[i][j] 将导致分段错误,因为最高级别的指针只指向一件事,而两个情人级别的指针指向数组。

一种解决方案是改用data[0][i][j]

【讨论】:

  • 这很难看,像 Kevin 建议的那样使用括号。
  • 嗯……我觉得很好。
  • 是主观的。但对我来说,a[0] 的含义是访问 this 指向的数组的第一个元素*a 的含义是取消引用指针。即使他们做同样的事情,意思也不同。
猜你喜欢
  • 2013-09-07
  • 2016-06-24
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
相关资源
最近更新 更多