首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

这个段异常,是什么原因

2013-09-14 
这个段错误,是什么原因?typedef struct ringlink_operations{void *(*ringlink_malloc)(unsigned int size

这个段错误,是什么原因?
typedef struct ringlink_operations
{
void *(*ringlink_malloc)(unsigned int size);
void (*ringlink_free)(void *dest);
void (*ringlink_memset)(void *dest, int value, unsigned int size);
void (*ringlink_memcpy)(void *dest, void *src, unsigned int size);
}ringlink_operations_t;

typedef struct ringlink
{
ringlink_operations_t *operations;
ringlink_mem_t*head;
ringlink_mem_t *read; /*Current position of read pointer.*/
ringlink_mem_t *write; /*Current position of read pointer.*/
ringlink_param_t param;
ringlink_status_t status;
}ringlink_t;

int ringlink_create(ringlink_t *ringlink, ringlink_operations_t *operations, ringlink_param_t *param)
{
int i;
ringlink_mem_t *temp;

RINGLINK_DBUG_LINE;
if((NULL==operations->ringlink_malloc) || 
(NULL==operations->ringlink_free) ||
(NULL==operations->ringlink_memcpy) ||
(NULL==operations->ringlink_memset))
{
RINGLINK_DBUG_LINE;
return -1;
}

RINGLINK_DBUG_LINE;
ringlink->operations = operations;

operations->ringlink_memcpy((char*)(&ringlink->param), (char*)param, sizeof(ringlink_param_t)); //这句正常
ringlink->operations->ringlink_memcpy((char*)(&ringlink->param), (char*)param, sizeof(ringlink_param_t));
       .........
}

static ringlink_operations_t userspace_operatioins = 
{
.ringlink_malloc = malloc,
.ringlink_free = free,
.ringlink_memset = memset,
.ringlink_memcpy = ringlik_memcpy,
};

ringlink_t tx;
int main()
{
int ret;

ringlink_param_t param;
param.key_size = 4;
param.value_size = 20;
param.total_count = 5;
param.overwrite_enable = 1;

ret = ringlink_create(&tx, &userspace_operatioins, &param); //这个函数里出错
printf("%s, %d ret=%d\n", __FUNCTION__, __LINE__, ret);

ringlink_show(&tx);

return 0;
} 段错误


[解决办法]
代码没看明白,给个提示吧。
首先,知道段错误是通常是怎么导致的。
段错误应该是访问了不可访问的内存,这个内存区要么是不存在的,要么是受到系统保护的,还有可能是缺少文件或者文件损坏。
段错误多是出现在代码段,80%的段错误在这里发生。

[解决办法]


ringlink->operations->ringlink_memcpy((char*)(&ringlink->param), (char*)param, sizeof(ringlink_param_t));

改为试试

ringlink->operations->ringlink_memcpy(&ringlink->param, param, sizeof(ringlink_param_t));

热点排行