我有一個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等的實際值嗎?? –