我有一个2层结构这样Ç段错误分配值在一个结构,以解决当
typedef struct data {
int datap;
int channelNumber;
} data;
typedef struct RingBuffer {
unsigned int *size;
unsigned int *start;
unsigned int *count;
unsigned int *end;
data *elems;
} RingBuffer;
我想在特定的存储器位置(嵌入式应用程序)与此初始化环形缓冲区的结构:
void rbInit(RingBuffer *rb, unsigned int size) {
//put rb into appropriate memory locations
rb->size = (unsigned int *) (RB_UTILS_SIZE + USERSPACE_OFFSET);
rb->start = (unsigned int *) (RB_UTILS_START + USERSPACE_OFFSET);
rb->count = (unsigned int *) (RB_UTILS_COUNT + USERSPACE_OFFSET);
rb->end = (unsigned int *) (RB_UTILS_END + USERSPACE_OFFSET);
rb->elems = (data *) (RB_DATA + USERSPACE_OFFSET);
//intialize rb parameter/pointer values
data empty;
empty.datap = 0;
empty.channelNumber = 0;
*(rb->size) = size; //SEGFAULT HERE
*(rb->start) = 0;
*(rb->count) = 0;
*(rb->end) = 0;
*(rb->elems) = empty;
}
但是,代码段错误(请参阅代码中的注释)。我用gdb检查过rb-> size确实指向了我想放置的位置,是的,该位置可用(BeagleBone PRU上的共享ram)。 RB_UTILS_SIZE
,USERSPACE_OFFSET
等只是其他地方定义的十六进制地址。
我对这可能是什么问题颇感兴趣。
如果您尝试直接分配该内存地址,它会工作吗?例如:*((unsigned int *)(RB_UTILS_SIZE + USERSPACE_OFFSET)= size; – FazJaxton
现在我在调用rbInit()的行的main()中添加了段错误(我将你的直接赋值行添加为rbInit中的第一行) ))这意味着我不能写入这个地址,尽管控件甚至没有输入rbInit(),但它只是在main中进行了段错误,而且我已经多次检查了TFM中的内存映射。事实上,我已经使用过这个地址,并且成功了。 – kbau
你能告诉我们你的指针,const等的实际值吗?? –