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。固定的。答案 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!!!