听说大神都在夜晚出没!!关于结构体指针交换问题!!

时间:2022-06-06 12:50:40
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()内的条件满足了运行交换语句程序就报错了呢 这是我设置断点得到的错误提示: 听说大神都在夜晚出没!!关于结构体指针交换问题!!

23 个解决方案

#1


指针变量t没有分配空间

#2


struct data *t;改成struct data t;
你的指针t没有指向有效的内存空间,所以发生了段错误。不需要用指针就不要用了。

#3


这问题不需要大神,我就能解决了  听说大神都在夜晚出没!!关于结构体指针交换问题!!

#4


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);
}
}

#5


引用 3 楼 derekrose 的回复:
这问题不需要大神,我就能解决了  听说大神都在夜晚出没!!关于结构体指针交换问题!!

+1

#6


引用 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出来啊

#7


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

#8


引用 3 楼 derekrose 的回复:
这问题不需要大神,我就能解决了  听说大神都在夜晚出没!!关于结构体指针交换问题!!
哈哈哈 知道我不知道的知识的都是大神! 嘻嘻~~

#9


引用 7 楼 qq695181966 的回复:
Quote: 引用 1 楼 dql870527 的回复:

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

#10


还有,有malloc的地方,用完一定要手动free,不然会内存泄漏的。

#11


*t
t =??????


#12



struct data *t;    //没有分配内存空间!使用的有内存出错的问题阿!

struct data *t = (struct data *)malloc(sizeof(struct data));

#13


struct data *t; 
请问,此时t指向内存中的什么位置?
不知道,就别用。

#14


引用 12 楼 max_min_ 的回复:

struct data *t;    //没有分配内存空间!使用的有内存出错的问题阿!

struct data *t = (struct data *)malloc(sizeof(struct data));


一针见血

#15


引用 7 楼 qq695181966 的回复:
Quote: 引用 1 楼 dql870527 的回复:

指针变量t没有分配空间
我在sortdata中定义了结构体指针t之后 令*t=4也出现这样的错误呀


关键不是你在哪里定义,而是定义指针变量后必须给它分配空间后才能往里面写内容,空间都没有,内容要写到哪儿

#16


引用 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 之后的交换也会出错呢?!

#17


引用 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;

#18


引用 16 楼 qq695181966 的回复:
我知道你们说的。 但是为什么我定义了struct data*t之后 令t=4 之后的交换也会出错呢?!

你知道“定义”和“申请内存”的区别?

#19


引用 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 之后的交换也会出错呢?!

像你主楼定义这样呢?没有空间的!要额外申请空间,然后再赋值操作
搞一本基础的书籍,补下基础,重点指针这块!

#20


引用 楼主 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()内的条件满足了运行交换语句程序就报错了呢 这是我设置断点得到的错误提示: 听说大神都在夜晚出没!!关于结构体指针交换问题!!


红色这行的问题

#21


ft,csdn请告诉我,为啥quote和加颜色不能嵌套。。。

for( j=i+1;j<len;j++)

#22


谁告诉你大神都在夜间出没的?

#23


引用 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;
很谢谢耐心的指教!!早已解决! 但是忘记结贴了!

#1


指针变量t没有分配空间

#2


struct data *t;改成struct data t;
你的指针t没有指向有效的内存空间,所以发生了段错误。不需要用指针就不要用了。

#3


这问题不需要大神,我就能解决了  听说大神都在夜晚出没!!关于结构体指针交换问题!!

#4


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);
}
}

#5


引用 3 楼 derekrose 的回复:
这问题不需要大神,我就能解决了  听说大神都在夜晚出没!!关于结构体指针交换问题!!

+1

#6


引用 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出来啊

#7


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

#8


引用 3 楼 derekrose 的回复:
这问题不需要大神,我就能解决了  听说大神都在夜晚出没!!关于结构体指针交换问题!!
哈哈哈 知道我不知道的知识的都是大神! 嘻嘻~~

#9


引用 7 楼 qq695181966 的回复:
Quote: 引用 1 楼 dql870527 的回复:

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

#10


还有,有malloc的地方,用完一定要手动free,不然会内存泄漏的。

#11


*t
t =??????


#12



struct data *t;    //没有分配内存空间!使用的有内存出错的问题阿!

struct data *t = (struct data *)malloc(sizeof(struct data));

#13


struct data *t; 
请问,此时t指向内存中的什么位置?
不知道,就别用。

#14


引用 12 楼 max_min_ 的回复:

struct data *t;    //没有分配内存空间!使用的有内存出错的问题阿!

struct data *t = (struct data *)malloc(sizeof(struct data));


一针见血

#15


引用 7 楼 qq695181966 的回复:
Quote: 引用 1 楼 dql870527 的回复:

指针变量t没有分配空间
我在sortdata中定义了结构体指针t之后 令*t=4也出现这样的错误呀


关键不是你在哪里定义,而是定义指针变量后必须给它分配空间后才能往里面写内容,空间都没有,内容要写到哪儿

#16


引用 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 之后的交换也会出错呢?!

#17


引用 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;

#18


引用 16 楼 qq695181966 的回复:
我知道你们说的。 但是为什么我定义了struct data*t之后 令t=4 之后的交换也会出错呢?!

你知道“定义”和“申请内存”的区别?

#19


引用 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 之后的交换也会出错呢?!

像你主楼定义这样呢?没有空间的!要额外申请空间,然后再赋值操作
搞一本基础的书籍,补下基础,重点指针这块!

#20


引用 楼主 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()内的条件满足了运行交换语句程序就报错了呢 这是我设置断点得到的错误提示: 听说大神都在夜晚出没!!关于结构体指针交换问题!!


红色这行的问题

#21


ft,csdn请告诉我,为啥quote和加颜色不能嵌套。。。

for( j=i+1;j<len;j++)

#22


谁告诉你大神都在夜间出没的?

#23


引用 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;
很谢谢耐心的指教!!早已解决! 但是忘记结贴了!