c-从外部访问函数内部的mallocated数组-意外结果



我有一个函数,设计用于malloc一个数组,然后用文件中的值填充它(n维坐标,尽管目前在2d中工作)。

#include <stdio.h>
#include <stdlib.h>
#define dim 2
typedef struct {
    double **array; /*store the coordinates*/
    int num; /* store the number of coordinates*/
    /* store some other things too */
} foo;
void read_particles(foo *bar);
int main(void)
{
    foo bar;
    read_particles(&bar);
    printf("n");
    for(int i = 0; i < bar.num; i++)
        printf("%f %fn", bar.array[0][i], bar.array[1][i]);
    /* printf here does not output the array properly.
     * Some values are correct, some are not.
     * Specifically, the first column bar.array[0][i] is correct, 
     * the second column bar.array[1][i] is not, some values from the 
     * first column are appearing in the second.
     */

    return 0;
}
void read_particles(foo *bar)
{
    FILE *f = fopen("xy.dat", "r");
    /* read number of coordinates from file first*/
    fscanf(f, "%d", &bar->num);
    bar->array = (double**) malloc(bar->num * sizeof(double*));
    for(int i = 0; i < bar->num; i++)
        bar->array[i] = (double*) malloc(dim * sizeof(double));
    for(int i = 0; i < bar->num; i++)
    {   
        for(int j = 0; j < dim; j++)
            fscanf(f, "%lf", &(bar->array[j][i]));
        /* For now, coordinates are just 2d, print them out
         * The values are displayed correctly when printing here*/
        printf("%f %fn", bar->array[0][i], bar->array[1][i]);
    }
    fclose(f);
}

此处提供了一些示例数据。

当从函数内部打印值时,它们是好的,当在函数外部打印时,它们不是。所以我一定没有正确处理指针。可能值得注意(也可能不值得注意)的是,我最初没有使用结构,而是将函数定义为double **read_and_malloc(num),返回指向数组的指针,并且产生的输出是相同的。

那到底发生了什么?

我可以包括一些样本数据,或者任何其他信息,如果需要的话。

您的第二个循环不正确:

for(int i = 0; i < dim; i++)
    bar->array[i] = (double*) malloc(dim * sizeof(double));

您创建了bar->num元素,但对dim元素进行了迭代:

bar->array = (double**) malloc(bar->num * sizeof(double*))

循环应该迭代第一个维度中的元素数量:bar->num

在更新的代码中,您将分配bar->num行和2列。但是,您的fscanfprintf代码尝试处理具有2行和bar->num列的数组。

为了保持您的读/写代码完好无损,分配代码将是:

bar->array = malloc(dim * sizeof *bar->array);
for (int i = 0; i < dim; ++i)
    bar->array[j] = malloc(bar->num * sizeof *bar->array[j]);

注:。如果您不熟悉这个malloc习惯用法,请参阅此处的

相关内容

  • 没有找到相关文章

最新更新