首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请问这个结构的复制,为什么可以编译通过,却运行出错

2012-03-27 
请教这个结构的复制,为什么可以编译通过,却运行出错?这个是我的程序的简化例子,能够编译通过,在运行的时候

请教这个结构的复制,为什么可以编译通过,却运行出错?
这个是我的程序的简化例子,能够编译通过,在运行的时候,却出现了错误,请教大家,哪里有问题呢?


#include   "stdlib.h "
#include   "stddef.h "
#include   "string.h "
#include   "ctype.h "
#include   "stdio.h "
#include   "math.h "
#include   "assert.h "

struct   feanode
{
char   feaname[10];
char   *c_range[5];
}feanode;

struct   feanode   nb1={ "adcde ",{ "aaa ", "bbb ", "ccc ", "ddd ", "eee "}};


void   memcopy(struct   feanode   *dest,   struct   feanode   *sour)
{
int   j;
struct   feanode   *p,*q;
char   **ch1,**ch2;

p=sour;
q=dest;
memcpy(q,p,sizeof(struct   feanode));
ch1=p-> c_range;
ch2=q-> c_range;
for(j=0;   j <3;   j++)
strcpy(*(ch2+j),*(ch1+j));
}


void   main()
{
int   j;
struct   feanode   *nb2;
nb2=(struct   feanode   *)malloc(sizeof(struct   feanode));
assert(nb2!=NULL);
memcopy(nb2,&nb1);
for(j=0;   j <5;   j++)
strcpy(*(nb1.c_range+j),*(nb2-> c_range+j));
for(j=0;   j <5;   j++)
printf( "%s\n ",*(nb2-> c_range+j));
}

多谢了!


[解决办法]
你原来的程序
strcpy(*(nb1.c_range+j),*(nb2-> c_range+j)); 会出错

*(nb1.c_range+j)只是一指针,并不是一段内存地址,
你往里面拷贝字符串,所以出错
[解决办法]
strcpy(*(ch2+j),*(ch1+j));//这句肯定错了

因为:
struct feanode
{
char feaname[10];
char *c_range[5];//这个只是一个5个指针而已
}feanode;

struct feanode nb1={ "adcde ",{ "aaa ", "bbb ", "ccc ", "ddd ", "eee "}};//这行的初始化只是给指针赋值,并未给c_range分配内存,你后面去copy内容给它当然会出现内存访问错误!

参考改法:
struct feanode
{
char feaname[10];
char c_range[5][10];//10你可以按具体定
}feanode;


热点排行