user-0 提问: memset(pt->data, 0, 100) 这句是不是有问题？

回复:
user: user-1
content: #define HEAP_DEFAULT_SIZE 100 #define HEAP_EXTENDED_SIZE 200  // 用这种写法，根本不需要一个指针指来指去的 typedef struct t_type { 	int code; 	unsigned char data[]; } mytype;  int main(void) { 	mytype *pt = (mytype *)malloc(sizeof(mytype) + HEAP_DEFAULT_SIZE * sizeof(unsigned char)); 	if (pt != NULL) 	{ 		pt->code = 2; 		memset(pt->data, 0, HEAP_DEFAULT_SIZE); 		*pt->data = 'a'; 		mytype *pn = (mytype *)realloc(pt, sizeof(mytype) + HEAP_EXTENDED_SIZE * sizeof(unsigned char)); 		if (pn != NULL) 		{ 			pt = pn; 			memset(pt->data, 0, HEAP_EXTENDED_SIZE); 			*pt->data = 'b'; 		} 		free(pt); 	} 	return 0; }

user: user-2
content: 22楼的规范

user: user-3
content: 21楼正解！

user: user-4
content: 引用 22 楼 zhoujielunzhimi 的回复:mytype mt; mt.code = 100; mt.data = (unsingned char*) malloc(sizeof(unsigned char) * 100); memset(mt.data, 0, 100); mytype mt; mt.code = 100; mt.data = (unsingned char*) malloc(sizeof(unsigned char) * 100); memset(mt.data, 0, sizeof(unsigned char) * 100);

user: user-4
content: mytype mt; mt.code = 100; mt.data = (unsingned char*) malloc(sizeof(unsigned char) * 100); memset(mt.data, 0, 100);

user: user-3
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h>  typedef struct t_type {     int code;     unsigned char *data; } mytype;  int main() {     mytype *pt = (mytype *)malloc(sizeof(mytype) + 100);     pt->code = 2;     pt->data = (unsigned char *)pt + sizeof(mytype);     memset(pt->data, 0, 100);     *(pt->data) = 'a';     unsigned char *tmp = pt->data;     unsigned char *pn = (unsigned char *)malloc(200);     if (pn == 0) {         printf("malloc is error!");         return -1;     }     memset(pn, 0, 200);     pt->data = pn;     free(pn);     free(pt);     return 0; }

user: user-3
content: free(tmp); 应改为  free(pn);

user: user-3
content: pt->data = (unsigned char *)(pt + sizeof(mytype)); 应改为  pt->data = (unsigned char *)pt + sizeof(mytype);

user: user-0
content: 引用 16 楼 Saleayas 的回复:free(tmp);这句不正确。 这一句为什么不正确？

user: user-0
content: 引用 16 楼 Saleayas 的回复:free(tmp);这句不正确。 执行不到这一句就崩了。

user: user-5
content: free(tmp);这句不正确。

user: user-0
content: 引用 14 楼 destory27 的回复:[quote=引用 13 楼 1FCSOFT 的回复:] [quote=引用 12 楼 destory27 的回复:]   memset(&p->data, 0, 1); 不明白什么意思[/quote]  void *memset(void *s,int c,size_t n)        第一个参数是指针类型，，所以传地址[/quote] pt,pt->data本身都是指针地址

user: user-0
content: 引用 10 楼 kugeniha 的回复:sizeof(mytype)      建议输出一下 输出结果：8（int 4+指针4）

user: user-6
content: 引用 13 楼 1FCSOFT 的回复:[quote=引用 12 楼 destory27 的回复:]   memset(&p->data, 0, 1); 不明白什么意思[/quote]  void *memset(void *s,int c,size_t n)        第一个参数是指针类型，，所以传地址

user: user-0
content: 引用 12 楼 destory27 的回复:memset(&p->data, 0, 1); 不明白什么意思

user: user-6
content: memset(&p->data, 0, 1);

user: user-7
content: sizeof(mytype)      建议输出一下

user: user-0
content: 再修改一次： typedef struct t_type{     int code;     unsigned char *data; } mytype;  int main() {     int dataSize = 100;//100就不行，换成665就可以，为什么？     int objNum = 8;     mytype *pt = (mytype *)malloc(sizeof(mytype) * objNum + dataSize);     pt->code = 2;     pt->data = (unsigned char *)(pt + objNum); //指向data空间首地址     printf("%d:%d", pt, pt->data); //显示data指针相对pt移动了64个字节，这个合理     memset(pt->data, 0, dataSize);//给data初始化     *(pt->data) = 'a';     unsigned char *tmp = pt->data;     unsigned char *pn = (unsigned char *)malloc(200);     if (pn == 0)     {         printf("malloc is error!");         return -1;     }     memset(pn, 0, 200);     pt->data = pn;     free(tmp);     free(pt);     return 0; }

user: user-0
content: 引用 7 楼 kugeniha 的回复:挪8个结构体后，剩下的空间已经没有100那么大了，所有后面的memset 100有问题 改成 memset(pt->data, 0, 1);还是出错

user: user-8
content: (unsigned char *)(pt + sizeof(mytype)) 可能已经越界了  对指针pt加一个数，移动的是这个数乘以这个类型的大小