我第一次来这里。试图通过搜索找到解决方案,但我仍然无法在这里看到我的问题:
STRUCT
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-&gt; m。我有一种感觉,我搞砸了一些指针与地址,但我找不到它..
至于重新编写所有代码,我想尝试将变量保存在main(无全局变量)中。
答案 0 :(得分:3)
据推测,你可以说明为什么这个功能不起作用:
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);
}
请注意,运算符*
(一元)的过程低于运算符->
,因此不能省略括号。
答案 1 :(得分:0)
问题是,在你的函数内部,你试图为u
分配内存,而你已经传递了一个静态分配变量的地址。因此,在您的函数内部,当您尝试访问调用者中传递的参数时,您将不会写入临时内存位置。
因此,函数内部u
的内存实例是函数的本地实例,当函数退出时,所做的更改将消失。删除内存分配,你不需要。