user-0 提问: 听说大神都在夜晚出没！！关于结构体指针交换问题！！

回复:
user: user-0
content: 引用 17 楼 Adol1111 的回复:[quote=引用 16 楼 qq695181966 的回复:] 我知道你们说的。 但是为什么我定义了struct data*t之后 令t=4 之后的交换也会出错呢？！ 自己随意指定的地址仍然是非法的。就好比你不给指针分配值，那指针就没有指向的地址吗？显然是不对的。 C/C++不存在所谓的无值对象，也就是Objective-C里的NIL类型，所以指针都是有值的。 那为什么仍然无法访问？很简单，计算机只是锁住了这个内存，除非你建立了一个对象，或者向系统申请一块空间，这个时候系统就会打开这块空间的使用权，那你就能正常访问了。 但是，系统打开了使用权，却不是这个指针的默认地址，而是取了一个新的地址，然后又赋给了你。所以你根本就不可能知道计算机的有效地址在哪里，因此t=4 99%是非法的。  你要么malloc一块地址，即像系统申请，要么就不要用指针了。这里其实用struct data t是最好的。没必要用什么指针：struct data t=*(p+i); *(p+i)=*(p+j); *(p+j)=t;[/quote]很谢谢耐心的指教！！早已解决！ 但是忘记结贴了！

user: user-1
content: 谁告诉你大神都在夜间出没的？

user: user-2
content: 引用 16 楼 qq695181966 的回复:我知道你们说的。 但是为什么我定义了struct data*t之后 令t=4 之后的交换也会出错呢？！ 自己随意指定的地址仍然是非法的。就好比你不给指针分配值，那指针就没有指向的地址吗？显然是不对的。 C/C++不存在所谓的无值对象，也就是Objective-C里的NIL类型，所以指针都是有值的。 那为什么仍然无法访问？很简单，计算机只是锁住了这个内存，除非你建立了一个对象，或者向系统申请一块空间，这个时候系统就会打开这块空间的使用权，那你就能正常访问了。 但是，系统打开了使用权，却不是这个指针的默认地址，而是取了一个新的地址，然后又赋给了你。所以你根本就不可能知道计算机的有效地址在哪里，因此t=4 99%是非法的。  你要么malloc一块地址，即像系统申请，要么就不要用指针了。这里其实用struct data t是最好的。没必要用什么指针：struct data t=*(p+i); *(p+i)=*(p+j); *(p+j)=t;

user: user-3
content: ft，csdn请告诉我，为啥quote和加颜色不能嵌套。。。  for(j=i+1;j<len;j++)

user: user-3
content: 引用 楼主 qq695181966 的回复:void sortdata(struct data *p,int len) { 	int i,j; 	struct data *t;	 	for(i=0;i<len;i++) 	{ 		for(j=i+1;j<len;j++) 		{ 			if((p+i)->sum<(p+j)->sum) 			{ 				*t=*(p+i); 				*(p+i)=*(p+j); 				*(p+j)=*t; 			} 		} 	} 	for(i=0;i<len;i++,p++) 	{ 		printf("number:%d\t",p->number); 		printf("name:%s\t",p->name); 		printf("chinese:%.1f\t",p->chinese); 		printf("math:%.1f\t",p->math); 		printf("english:%.1f\t",p->english); 		printf("sum:%.1f\n",p->sum); 	} } 这个是我编写的程序中的一小段 我想进行以sum给标准的升序排序。但是为什么如果if（）内的条件满足了运行交换语句程序就报错了呢 这是我设置断点得到的错误提示：  红色这行的问题

user: user-4
content: 引用 16 楼 qq695181966 的回复:[quote=引用 12 楼 max_min_ 的回复:]  struct data *t;    //没有分配内存空间！使用的有内存出错的问题阿！  struct data *t = (struct data *)malloc(sizeof(struct data)); 引用 13 楼 baichi4141 的回复:struct data *t;  请问，此时t指向内存中的什么位置？ 不知道，就别用。 我知道你们说的。 但是为什么我定义了struct data*t之后 令t=4 之后的交换也会出错呢？！[/quote] 像你主楼定义这样呢？没有空间的！要额外申请空间，然后再赋值操作 搞一本基础的书籍，补下基础，重点指针这块！

user: user-5
content: 引用 16 楼 qq695181966 的回复:我知道你们说的。 但是为什么我定义了struct data*t之后 令t=4 之后的交换也会出错呢？！ 你知道“定义”和“申请内存”的区别？

user: user-6
content: 引用 3 楼 derekrose 的回复:这问题不需要大神，我就能解决了  +1

user: user-7
content: void sortdata(/*struct*/ data *p,int len) { 	int i,j; 	/*struct*/ data t;	 	for(i=0;i<len;i++) 	{ 		for(j=i+1;j<len;j++) 		{ 			if((p+i)->sum<(p+j)->sum) 			{ 				t=*(p+i); 				*(p+i)=*(p+j); 				*(p+j)=t; 			} 		} 	} //sort就sort，打印这些干嘛？ 	for(i=0;i<len;i++,p++) 	{ 		printf("number:%d\t",p->number); 		printf("name:%s\t",p->name); 		printf("chinese:%.1f\t",p->chinese); 		printf("math:%.1f\t",p->math); 		printf("english:%.1f\t",p->english); 		printf("sum:%.1f\n",p->sum); 	} }

user: user-8
content: 引用 12 楼 max_min_ 的回复: struct data *t;    //没有分配内存空间！使用的有内存出错的问题阿！  struct data *t = (struct data *)malloc(sizeof(struct data));  一针见血

user: user-5
content: struct data *t;  请问，此时t指向内存中的什么位置？ 不知道，就别用。

user: user-4
content: struct data *t;    //没有分配内存空间！使用的有内存出错的问题阿！  struct data *t = (struct data *)malloc(sizeof(struct data));

user: user-9
content: *t t =？？？？？？

user: user-2
content: 还有，有malloc的地方，用完一定要手动free，不然会内存泄漏的。

user: user-2
content: 引用 7 楼 qq695181966 的回复:引用 1 楼 user-10 的回复:指针变量t没有分配空间我在sortdata中定义了结构体指针t之后 令*t=4也出现这样的错误呀struct data a; struct data *t; t=&a;//引用有效地址 t=(struct data*)malloc(sizeof(struct data));//分配有效内存直接用*t=4是非法的。

user: user-0
content: 引用 12 楼 max_min_ 的回复: struct data *t;    //没有分配内存空间！使用的有内存出错的问题阿！  struct data *t = (struct data *)malloc(sizeof(struct data)); 引用 13 楼 baichi4141 的回复:struct data *t;  请问，此时t指向内存中的什么位置？ 不知道，就别用。 我知道你们说的。 但是为什么我定义了struct data*t之后 令t=4 之后的交换也会出错呢？！

user: user-0
content: 引用 3 楼 derekrose 的回复:这问题不需要大神，我就能解决了 哈哈哈 知道我不知道的知识的都是大神！ 嘻嘻~~

user: user-0
content: 引用 1 楼 user-10 的回复:指针变量t没有分配空间我在sortdata中定义了结构体指针t之后 令*t=4也出现这样的错误呀

user: user-0
content: 引用 4 楼 worldy 的回复:void sortdata(/*struct*/ data *p,int len) { 	int i,j; 	/*struct*/ data t;	 	for(i=0;i<len;i++) 	{ 		for(j=i+1;j<len;j++) 		{ 			if((p+i)->sum<(p+j)->sum) 			{ 				t=*(p+i); 				*(p+i)=*(p+j); 				*(p+j)=t; 			} 		} 	} //sort就sort，打印这些干嘛？ 	for(i=0;i<len;i++,p++) 	{ 		printf("number:%d\t",p->number); 		printf("name:%s\t",p->name); 		printf("chinese:%.1f\t",p->chinese); 		printf("math:%.1f\t",p->math); 		printf("english:%.1f\t",p->english); 		printf("sum:%.1f\n",p->sum); 	} }sort了之后printf出来啊

user: user-10
content: 引用 7 楼 qq695181966 的回复:引用 1 楼 user-10 的回复:指针变量t没有分配空间我在sortdata中定义了结构体指针t之后 令*t=4也出现这样的错误呀  关键不是你在哪里定义，而是定义指针变量后必须给它分配空间后才能往里面写内容，空间都没有，内容要写到哪儿