C结构:问题初始化? Valgrind错误

时间:2011-04-19 01:49:37

标签: c struct valgrind

C编码:

typedef struct {
   char *string;
   int one;
   int two;
} Example;

......其他地方:

Example *new = (Example *)malloc(sizeof(Example*));
new->string = strdup(otherstring); //no problem here
new->one = 5; //valgrind says that there is an invalid write of size 4.

我的程序运行良好,我无法让valgrind开心。这可能意味着我在其他地方会有其他错误。

我想我不必声明一个指向结构的指针(也就是说,我可以调用“示例新”),但是我发现如何在堆上分配内存因为我需要从程序的其他部分访问“新”。

我在以上几行中犯了错误吗?或者我的错误可能在其他地方?这是valgrind报告的第一个内存错误。

编辑:在我的struct中意外地有int * s而不是int。固定的。

3 个答案:

答案 0 :(得分:3)

我在这里看到各种问题。首先,这个:

Example *new = (Example *)malloc(sizeof(Example*));

没有分配适量的内存(而且你不需要强制转换)。你想要这个:

Example *new = malloc(sizeof(Example));

然后,你这样说:

new->one = 5;

并且正在为int分配int*;这不是一个好主意,valgrind正确地抱怨它。如果你的struct被正确宣布,那么你想要这个:

new->one = malloc(sizeof(int)); /* The other malloc doesn't allocate this, you have to. */
*(new->one) = 5;

我怀疑(正如你说一切正常)你真的想要宣布你的struct

typedef struct {
   char *string;
   int one;
   int *two;
} Example;

但没有足够的信息可以确定。然后,您可能仍然遇到与new->two类似的问题。

答案 1 :(得分:0)

示例* new =(示例)malloc(sizeof(示例));

应该是:

示例* new =(示例*)malloc(sizeof(示例);

您必须分配整个结构而不仅仅是对它的引用。有时程序运行只是因为你很幸运。

答案 2 :(得分:0)

尝试这样做(只需剪切,粘贴和运行):

Example *new = (Example *)malloc(sizeof(Example));  //This is the correct method as pointed out by Bob, otherwise you're allocating only enough space to fit a memory location vs the struct
new->string = strdup(otherstring);  //this is okay
new->one = (int*)malloc(sizeof(int));
*(new->one) = 5; //You want to assign the value 5 to the new->one memory location, not assign new->one pointer the value of 5!!!