读书人

请问这个结构的复制为什么可以编译通

发布时间: 2012-03-27 13:44:24 作者: rapoo

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


#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;


读书人网 >C语言

热点推荐