user-0 提问: 小弟有个动态内存free的小问题请高手指教

回复:
user: user-1
content: pstu1->name指向的是 一个字节的字符地址。你又在这个字节里面放一个字符串，肯定不行啊

user: user-2
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-3
content: 如上，二选一：#define MAX_NAME_LENGTH 32  struct STUDENT {     char *name;     int score; } *pstu1;  int main() {     pstu1 = (struct STUDENT*)malloc(sizeof(struct STUDENT));     pstu1->name = (char*)malloc(sizeof(char) * MAX_NAME_LENGTH);     strncpy(pstu1->name, "Jimmy", MAX_NAME_LENGTH);     pstu1->score = 99;     printf("%s: %d\n", pstu1->name, pstu1->score);     free(pstu1->name);     free(pstu1);     return 0; }#define MAX_NAME_LENGTH 32  struct STUDENT {     char name[MAX_NAME_LENGTH];     int score; } *pstu1;  int main() {     pstu1 = (struct STUDENT*)malloc(sizeof(struct STUDENT));     strncpy(pstu1->name, "Jimmy", MAX_NAME_LENGTH);     pstu1->score = 99;     printf("%s: %d\n", pstu1->name, pstu1->score);     free(pstu1);     return 0; }

user: user-4
content: 开辟的内存太小， 不够赋值。 所以就报错了。 开辟的内存要略大于你所写数据。

user: user-5
content: 分配足够内存即可：  //pstu1->name = (char*)malloc(sizeof(char)); pstu1->name = (char*)malloc(sizeof(char) * 10);

user: user-6
content: 楼主的代码：  #include<stdlib.h> #include <stdio.h> #include<string.h>  struct STUDENT { char *name; int score; }*pstu1; int main() {	 pstu1=(struct STUDENT*)malloc(sizeof(struct STUDENT)); pstu1->name=(char*)malloc(sizeof(char)); strcpy(pstu1->name,"Jimmy"); pstu1->score=99; printf("%s : %d",pstu1->name,pstu1->score); free(pstu1->name); free(pstu1);	 return 0; }  改后的代码  #include<stdlib.h> #include <stdio.h> #include<string.h>  struct STUDENT { char *name; int score; }*pstu1; int main() {	 pstu1=(struct STUDENT*)malloc(sizeof(struct STUDENT)); pstu1->name="Jimmy"; pstu1->score=99; printf("%s : %d",pstu1->name,pstu1->score); free(pstu1);	 return 0; }  楼主的问题： pstu1=(struct STUDENT*)malloc(sizeof(struct STUDENT));  //指针变量pstu1分配了内存。 pstu1->name=(char*)malloc(sizeof(char)); // //指针变量pstu1中的name成员 再 分配内存。可能此不与上步有相同内存部分 free(pstu1->name);是单独释放结构体所占内存的name成员部分。

user: user-7
content: 现在计算机程序运行内存实际上为虚拟内存，你用new申请的内存为一个字节，但是你写入的不只一个字节，在linux系统中（其他系统类似），堆其实是个链表，维护的有上一个内存块的位置，下一个内存块的位置，当前块的大小等信息，你越界放入数据以后，存取的时候没有问题，但是你破坏了维护结构，释放的时候就会出问题

user: user-2
content: 关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

user: user-8
content: 你只分配了一个字节 sizeof(char), 却往里面写入了 "Jimmy" 这么长一串，当然破坏了

user: user-9
content: 引用 6 楼 mutoyc 的回复:[quote=引用 5 楼 xian_wwq 的回复:] [quote=引用 楼主 mutoyc 的回复:] 代码如下： #include<stdlib.h> #include <stdio.h> #include<string.h>  struct STUDENT { 	char *name; 	int score; }*pstu1; int main() {	 	pstu1=(struct STUDENT*)malloc(sizeof(struct STUDENT)); 	pstu1->name=(char*)malloc(sizeof(char));   //分配的空间不够 	strcpy(pstu1->name,"Jimmy"); 	pstu1->score=99; 	printf("%s : %d",pstu1->name,pstu1->score); 	free(pstu1->name); 	free(pstu1);	 	return 0; } 调试中free(pstu1->name);这句总是报错说“堆破坏”，求大神解答 可以把char* 换成定长的char数组[/quote] 请问换成char数组以后，数组内的“Jimmy”字符串储存在那块内存中？是堆中还是常量储存区中？[/quote] 如果是局部的数组,就是栈里面，否则就是堆立面。

user: user-0
content: 引用 5 楼 xian_wwq 的回复:[quote=引用 楼主 mutoyc 的回复:] 代码如下： #include<stdlib.h> #include <stdio.h> #include<string.h>  struct STUDENT { 	char *name; 	int score; }*pstu1; int main() {	 	pstu1=(struct STUDENT*)malloc(sizeof(struct STUDENT)); 	pstu1->name=(char*)malloc(sizeof(char));   //分配的空间不够 	strcpy(pstu1->name,"Jimmy"); 	pstu1->score=99; 	printf("%s : %d",pstu1->name,pstu1->score); 	free(pstu1->name); 	free(pstu1);	 	return 0; } 调试中free(pstu1->name);这句总是报错说“堆破坏”，求大神解答 可以把char* 换成定长的char数组[/quote] 请问换成char数组以后，数组内的“Jimmy”字符串储存在那块内存中？是堆中还是常量储存区中？

user: user-10
content: 引用 楼主 mutoyc 的回复:代码如下： #include<stdlib.h> #include <stdio.h> #include<string.h>  struct STUDENT { 	char *name; 	int score; }*pstu1; int main() {	 	pstu1=(struct STUDENT*)malloc(sizeof(struct STUDENT)); 	pstu1->name=(char*)malloc(sizeof(char));   //分配的空间不够 	strcpy(pstu1->name,"Jimmy"); 	pstu1->score=99; 	printf("%s : %d",pstu1->name,pstu1->score); 	free(pstu1->name); 	free(pstu1);	 	return 0; } 调试中free(pstu1->name);这句总是报错说“堆破坏”，求大神解答 可以把char* 换成定长的char数组

user: user-11
content: malloc的时候尽量申请的大小大于要写入的长度

user: user-0
content: 引用 1 楼 adlay 的回复:你只分配了一个字节 sizeof(char), 却往里面写入了 "Jimmy" 这么长一串，当然破坏了 就是说内存越界了是吗？