0

我正在用 C 语言编写一个函数,该函数需要在执行过程中修改多个变量,特别是最后 3 个参数。函数声明如下所示:

void Sample_v2(double cyl_radius, double thetaOx, double binsize, double ** newRx, double * binCenterThetas, double ** binCenters) 

我的变量如下:

int main() {
    // initialize function outputs
    double ** GPU_binCenters;
    double ** GPU_Rx;
    double * GPU_binCenterThetas;
    // set testing values
    double cyl_rad = 0.3;
    double theta = 1.5708;
    double binsiz = 0.0025;
    int n;

    Sample_v2(cyl_rad, theta, binsiz, GPU_Rx, GPU_binCenterThetas, GPU_binCenters);

    fprintf(stdout,"GPU_binCenters\n");
    for (n = 0; n < 188; n++) {
        fprintf(stdout, "%G\n", GPU_binCenterThetas[n]);
    }
}

我用以下代码给我的数组值:

newRx = (double**) calloc((int)ceil(howmany) * 2, sizeof(double*));
for (ii = 0; ii < (int)ceil(howmany) * 2; ii++) {
    newRx[ii] = (double*) calloc(2, sizeof(double));
}

或者

binCenterThetas = (double*) calloc((int)ceil(howmany)*2+1, sizeof(double));

当我尝试在 for 循环中的 fprintf 语句上运行它时,它第一次运行时会出现段错误。使用 gdb 我也无法手动读取值,但我可以看到指针地址。我认为当我传递指针时它正在被复制,但我尝试实现另一个解决方案,传递我需要通过引用修改的变量并且也有问题。代码如下:

Sample_v2(cyl_rad, theta, binsiz, &GPU_Rx, &GPU_binCenterThetas, &GPU_binCenters);

    ...........

void Sample_v2(double cyl_radius, double thetaOx, double binsize, double *** newRx, double ** binCenterThetas, double *** binCenters) {

    ...........

*newRx = (double**) malloc((int)ceil(howmany) * 2 * sizeof(double*));
for (ii = 0; ii < (int)ceil(howmany) * 2; ii++) {
    *newRx[ii] = (double*) malloc(2 * sizeof(double));
}

在 for 循环中分配内存时,该代码会出现段错误。关于如何真正让我的数组在没有段错误的情况下传递或初始化的任何帮助。请注意,我没有使用 return 语句,因为我在函数中修改了 3 个数组。

4

1 回答 1

2

你打电话时

Sample_v2(cyl_rad, theta, binsiz, GPU_Rx, GPU_binCenterThetas, GPU_binCenters);

接收到的参数Sample_v2是 in 指针的副本,对这些指针main所做的任何更改Sample_v2都不会影响 in 的指针main,因此当您进入fprintf循环时,GPU_binCenterThetas仍然是未初始化的指针,并且访问GPU_binCenterThetas[n]是未定义的行为,可能会导致段错误。

处理这个问题的正确方法确实是添加一个间接层并传递这些指针的地址(或者定义一个struct包含三个适当类型的指针并返回它;如果只有一个指针要修改,返回指针将是我的首选方式 - 如果返回指针,它们不需要作为参数传递)。

您尝试的问题

Sample_v2(cyl_rad, theta, binsiz, &GPU_Rx, &GPU_binCenterThetas, &GPU_binCenters);

    ...........

void Sample_v2(double cyl_radius, double thetaOx, double binsize, double *** newRx, double ** binCenterThetas, double *** binCenters) {

    ...........

*newRx = (double**) malloc((int)ceil(howmany) * 2 * sizeof(double*));
for (ii = 0; ii < (int)ceil(howmany) * 2; ii++) {
    *newRx[ii] = (double*) malloc(2 * sizeof(double));
}

是你弄错了优先级。

*newRx[ii]

*(newRx[ii])

newRx[ii]只是 . 的有效指针ii == 0。你的意思是

(*newRx)[ii]

(其他类似)。

于 2013-02-13T18:58:50.567 回答