c - 分配后访问结构体成员

标签 c struct malloc dynamic-memory-allocation

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

结构体

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 值在分配函数内正确打印,但由于某种原因,我不允许在外部使用 u->m 。我有一种感觉,我搞乱了一些指针与地址,但我找不到它..

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

最佳答案

想必您可以知道为什么这个函数不起作用:

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);
}

请注意,运算符*(一元)的过程比运算符->低,因此括号不能省略。

关于c - 分配后访问结构体成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36336160/

相关文章:

c++ - 继承类使用继承结构

c++ - 了解在具体示例中使用 getilne

c - 是什么改变了我的 C 字符串中的 char 值?

C:尝试释放节点时出现 SegFault 错误

c - gcc 对其依赖项如此保守的真正原因是什么? ( MPFR, GMP, MPC )

c - 如何将无符号的磁力计数据转换为度数

c - unistd.h 的 `l` 中的 `lseek` 是什么意思?

c# - 如果我有一个以非只读结构作为成员的 c# 只读结构,编译器是否会创建带有 in 参数的防御性副本

c - 如何释放我的单链表程序?

c - typedef 指针使用 fgets 输入数据,但需要最后一个 fgets