【问题标题】:Accessing struct members after allocating分配后访问结构成员
【发布时间】:2016-07-20 01:40:24
【问题描述】:

我第一次来这里。试图通过搜索找到解决方案,但我仍然无法在这里看到我的问题:

结构

typedef struct
{
    float** image_data;  
    int m;             
     int n;             
} image;

短路的主要

int main(int argc, char *argv[])
{
    int m, n, c, iters;
    image u;
    unsigned char *image_chars;
    char *input_jpeg_filename, *output_jpeg_filename;

    /*funtion importing jpeg sets chars and hight/width (works)*/ 
    import_JPEG_file(input_jpeg_filename, &image_chars, &m, &n, &c);

    allocate_image (&u, m, n);
    printf"m og n (in main function): %i %i\n", u->m, u->n);

    return 0;
}

分配函数

void allocate_image(image *u, int m, int n)
{
    u = malloc(sizeof(struct image));

    u->m=m;
    u->n=n;

    int i;
    u->image_data=(float**)malloc(m*sizeof(float*));
    for(i=0; i<m; i++){
        u->image_data[i]=(float*)malloc(n*sizeof(float));
    }

    printf("m og n: %i %i\n", u->m, u->n);
}

应该提到这是学校作业的一部分,但有人告诉我在这里问基本问题没有害处。我也仅限于 C89。

因此,正如经验丰富的编码人员可能已经看到的那样,它没有正确分配。 m 和 n 值在 allocate 函数中正确打印,但由于某种原因,我不允许在外部使用 u->m。我有一种感觉,我搞砸了一些指针与地址,但我找不到它..

至于重新编写所有代码,我想尝试将变量保留在 main 中(没有全局变量)。

【问题讨论】:

标签: c struct malloc dynamic-memory-allocation


【解决方案1】:

想必你能说出为什么这个功能不起作用:

void negate(int x)
{
    x = -x;
}

它不起作用,因为 C 中的参数是“按值传递”的。因此形参x的变化不会影响对应的实际变量。

在你的情况下,

void allocate_image(image *u, int m, int n)
{
    u = malloc(sizeof(struct image));
    ...

有同样的问题。要在函数中修改图像,您应该传递一个指向图像的指针;要在函数中修改指向图像的指针,您应该传递一个指向图像的指针

这里是细化的分配函数:

void allocate_image(image **u, int m, int n)
{
    *u = malloc(sizeof (struct image));

    (*u)->m = m;
    (*u)->n = n;

    size_t i;
    (*u)->image_data = malloc(m * sizeof (float *));
    for(i = 0; i < m; i++){
        (*u)->image_data[i] = malloc(n * sizeof (float));
    }

    printf("m og n: %i %i\n", (*u)->m, (*u)->n);
}

注意操作符*(unary) 的过程比操作符-&gt; 小,所以括号不能省略。

【讨论】:

    【解决方案2】:

    问题是,在你的函数内部,你试图为u 分配内存,而你传递了一个静态分配变量的地址。因此,在您的函数内部,您正在写入一个临时内存位置,当您尝试访问调用者中传递的参数时,该位置将不存在。

    因此,函数内部u的内存实例是函数本地的,所做的更改将在函数退出时消失。删除内存分配,你不需要。

    【讨论】:

    • 换句话说,要么你必须返回分配给u的指针,要么通过双重间接传递uvoid allocate_image(image **u, int m, int n),然后将u的所有引用更改为@987654327 @(由 u 指向的位置)。当然你需要在你的调用函数中传递&amp;u
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2013-05-31
    • 1970-01-01
    相关资源
    最近更新 更多