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