不好意思,我的是linux环境,稍微修改了一下程序才能运行
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
struct shm_data_st
{
struct shm_data_st *pre;
char data[10];
struct shm_data_st *next;
};
struct shm_data_st *init_shm_data(struct shm_data_st *memory,size_t size)
//把参数类型改了一下
{
struct
shm_data_st *pt = memory;
struct
shm_data_st *end = memory + size;
assert(memory != NULL && size != 0);
for (; pt < end; ++pt)
{
pt->pre = pt - 1;
#ifndef NDEBUG
sprintf(pt->data, "struct %d", pt - (struct shm_data_st*)memory);
#endif /* NDEBUG */
pt->next = pt + 1;
}
((struct shm_data_st*)memory)->pre = NULL;
pt[-1].next = NULL;
return memory;
}
int main(void)
{
char buf[1000];
struct shm_data_st *pt;
pt = (struct shm_data_st*)malloc(sizeof(struct shm_data_st));
struct shm_data_st *temp = (struct shm_data_st *)buf;
init_shm_data(pt, 1000);
//这个实参换了一个,不然通不过断言
init_shm_data(temp, 1000);
for (pt = (struct shm_data_st*)buf; pt != NULL;pt = pt->next)
{
puts(pt->data);
}
return 0;
}
/* cc: flags+='-DNDEBUG' */
程序在for循环里面出现了问题,有时候是pt->pre访问了不能访问的内存地址,有时候是pt->next,不过是循环多次以后才出现的,是否需要申请一块比较的的空间,当指针指向结构体后面以后的地址时,地址否可用我们并不能确定
所以才会有时候就是pt->pre,有时候就是 ptr->next访问了不能访问的内存空间
而且还发现,虽然for循环里面 ++pt 但是通过 printf 输出的结果来看,好现pt的地址没有变过,
我是用 printf("0x:%x", &pt);输出的,不知道有没有问题
先前我的pt+1的理解是错误的,pt+1实际上应该是pt + 1*(sizeof(struct shm_data_st))
还有pt[-1].next,这个真是不认识,在网上找了一下,好像不能搜索[],以前也没有见过
其实昨天的时候我是测试的一个比较简单的程序,是能够,使用shm_head->next = shm_head + sizeof(struct shm_data_st)的
但是今天重新写了一遍,就发现这句话达不到目的了很奇怪。这个我都是在一大片共享内存里面测试的。
[[it] 本帖最后由 asmdaydream 于 2009-7-26 03:39 编辑 [/it]]