如何在主函数中初始化结构体

3

我正在尝试编写一个简单的C程序来读取pgm文件。我必须创建一个简单的结构体:

typedef struct pgmImage {
   int R; //rows
   int C; //collumns
   int G; //grey scale
   int **pix;  // array of pixels
}Image;

现在我需要初始化一个空的图像结构。我需要一个函数来根据*.pgm文件设置所有变量。 每次我都会收到“无法读取内存”和“未初始化的本地变量x已使用”的错误提示。我尝试简单地执行以下操作:

Image *x=0;

但是当read函数尝试设置R、C、G值时,程序会崩溃。
3个回答

1
Image x = {0}

这是图像元素x的静态内存分配。

或者

Image *x = calloc(1,(sizeof(Image));

这是一种图像的动态内存分配,x 是指向已分配内存的指针。

calloc 将分配内存并将所有内存初始化为 0,因此结构中的指针将被系统地初始化为 NULL。


使用calloc与空指针的这种方式是不可移植的。 - md5
这是因为pix是一个双指针吗?这是你的意思吗? - MOHAMED
calloc函数将所有位都设置为零,但是NULL并不一定具有这样的表示形式。https://dev59.com/uG025IYBdhLWcg3wr4F6#5857706 - md5
@Kirilenko 我查了一些stdlib.h文件,发现NULL宏被定义为0,请查看以下链接:http://www.mers.byu.edu/docs/standardC/stdlib.html http://trac.assembla.com/chdk/browser/trunk/include/stdlib.h?order=name - MOHAMED

1
如果您想要一个指向图像的指针,您必须这样初始化。
Image *x = NULL;

访问图片 (x) 的方法如下:

x-> C = 0;
x-> ...
x->pix = NULL;

但首先您需要为图像分配内存。

x = (Image*) malloc(sizeof(Image));

0
如果你想使用指针,你必须分配足够的内存来容纳一个结构体。然而,你正在尝试解引用一个空指针:这会导致未定义的行为。
#include <stdlib.h>
Image *x = malloc(sizeof *x);

然后您可以初始化成员。注意:在此处使用calloc是不可移植的,因为不能保证空指针具有所有位零的内存表示。

无论如何,在这里似乎不需要使用指针。

#include <stddef.h>
Image x = { 0, 0, 0, NULL };

如果你执行 Image * x = malloc(sizeof x);,你会得到以下错误:从 'void' 到 'Image*' 的无效转换。 - dreamcrash
阅读我的回答。它是 Image *x - md5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接