读书人

关于结构体的几个问题

发布时间: 2012-03-08 13:30:13 作者: rapoo

关于结构体的几个小问题
被结构体搞的头大如斗,几个问题请教一下
程序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);

}

读书人网 >C语言

热点推荐