关于结构体的几个小问题
被结构体搞的头大如斗,几个问题请教一下
程序1
#include <stdio.h>
int main(){
struct point {
int x;
int y;
} ;
struct point p = {1,2};
struct point* pt;
pt = &p;//问题1: 此行,在这种形式下没问题,但是如果换成 *pt = p,运行报segmentation fault,何解?
printf( "x:%d y: %d\n ", p.x, p.y);
}
程序2:
#include <stdio.h>
int main(){
struct point {
int x;
int y;
} ;
//setpoint函数设置两个点
struct point* setpoint(int inx, int iny){
struct point* pp;
pp -> x = inx;
pp -> y = iny;
return pp;
}
struct point* p = setpoint(1,2);
printf( "x:%d y: %d\n ", p -> x, p -> y);
}
问题2:运行时segmentation fault, 用GDB调试发现
main () at test.c:19
19 printf( "x:%d y: %d\n ", p -> x, p -> y);
(gdb) p p -> x
$1 = 1
(gdb) p p -> y
$2 = 2
(gdb) s
Program received signal SIGSEGV, Segmentation fault.
0x4c5fda0b in _dl_fixup () from /lib/ld-linux.so.2
运行到printf出错,但是在gdb里用print p -> x 和 p -> y 结果分别是1 和2。何解?
问题3:
程序基本同程序2,只是把setpoint程序写在了主函数外面,在主函数声明 struct point* setpoint(int inx, int iny);
编译未通过
test.c:17: 错误:与 ‘setpoint’ 类型冲突
test.c:10: 错误:‘setpoint’ 的上一个声明在此
test.c: 在函数 ‘setpoint’ 中:
test.c:19: 错误:提领指向不完全类型的指针
test.c:20: 错误:提领指向不完全类型的指针
何解?
多谢!!
[解决办法]
pt = &p;//问题1: 此行,在这种形式下没问题,但是如果换成 *pt = p,运行报segmentation fault,何解?
------------------------------------------
*pt = p这样写是没错,可关键是你之前并没给pt分配空间,没有空间(地址)它如何存放p。运行报segmentation fault,是说有一个段错误,就说的是没有给指针分配空间。
问题2:运行时segmentation fault,
------------------------------
原因和上题是一样的:定义了这个struct point* pp;但是没有给它分配空间,在struct point* pp;后面增加一条语句pp = (struct point *)malloc(sizeof (struct point));(提醒:malloc属于头文件#include <malloc.h> )
问题3:
-------------
这个容易了。
直接这样写好了:
#include <stdio.h>
#include <malloc.h>
struct point {
int x;
int y;
} ;
struct point* setpoint(int inx, int iny)
{
struct point* pp;
pp = (struct point *)malloc(sizeof (struct point));
pp -> x = inx;
pp -> y = iny;
return pp;
}
int main(){
struct point* p = setpoint(1,2);
printf( "x:%d y: %d\n ", p -> x, p -> y);
}