#include <stdio.h>
#include <stdlib.h>
// Resource
typedef struct _Resource Resource;
// ResourceBuffer
typedef struct _ResourceBuffer ResourceBuffer;
ResourceBuffer *resource_buffer_new(int);
ResourceBuffer *resourceBuffer;
void resource_buffer_test();
struct _ResourceBuffer {
char *id;
int size;
Resource **buffer;
};
struct _Resource {
int id;
char *status;
};
Resource *resource_new(int i) {
Resource *r = malloc(sizeof(*r));
r->status = "groovy";
r->id = i;
return r;
}
void resource_buffer_test() {
printf("buftest has buf as %d\n",resourceBuffer->buffer);
printf("buftest has drefbuf as %d\n",*(resourceBuffer->buffer));
Resource *bp[resourceBuffer->size];
bp[0] = *(resourceBuffer->buffer+0);
bp[1] = *(resourceBuffer->buffer+1);
bp[2] = *(resourceBuffer->buffer+2);
int i = 0;
for (i = 0; i < 3; i++) {
printf("address is %d\n", bp[i]);
}
for (i = 0; i < 3; i++) {
//printf("ptrBuffer r%d is %s\n", i, (*((Resource **)(resourceBuffer->buffer)+i))->status);
printf("Buffer r%d is %s\n", bp[i]->id, bp[i]->status);
}
}
ResourceBuffer *resource_buffer_new(int bufferSize) {
ResourceBuffer *r = malloc(sizeof(*r));
Resource *b[bufferSize];
int i;
for (i = 0; i < bufferSize; i++) {
b[i] = resource_new(i);
}
for (i = 0; i < bufferSize; i++) {
printf("res address is %d\n", b[i]);
printf("pnt address is %d\n", &b[i]);
}
printf("b address is %d\n", b);
r->buffer = b;
printf("buffer set to %d\n", r->buffer);
r->size = bufferSize;
r->id = "foo";
return r;
}
int main(int argc, char** argv) {
// initialize buffer
resourceBuffer = resource_buffer_new(3);
resource_buffer_test();
return (EXIT_SUCCESS);
}
輸出是:爲什麼我的指針運算此數組中失敗
res address is 36585520
pnt address is 783569984
res address is 36585552
pnt address is 783569992
res address is 36585584
pnt address is 783570000
b address is 783569984
buffer set to 783569984
buftest has buf as 783569984
buftest has drefbuf as 36585520
address is 36585520
address is 36585552
address is 36585520
Buffer r0 is groovy
Buffer r1 is groovy
Buffer r0 is groovy
什麼混淆我是最後6行...爲什麼在resource_buffer_test()
做b[0]
和b[2]
最終指向資源結構r0?
出於某種原因,這部分失敗:
bp[0] = *(resourceBuffer->buffer+0);
bp[1] = *(resourceBuffer->buffer+1);
bp[2] = *(resourceBuffer->buffer+2);
凡*(resourceBuffer->buffer+2)
不知何故最終陣列中指向回第一元件,而不是三分之一。
爲什麼會發生這種情況?什麼導致C指針算術重置*(resourceBuffer->buffer+2)
回到*(resourceBuffer->buffer+0)
?
什麼是真正奇怪的(反正我)......是,當我改變resource_buffer_new
功能看起來像這樣:
ResourceBuffer *resource_buffer_new(int bufferSize) {
ResourceBuffer *r = malloc(sizeof(*r));
Resource *b[bufferSize+1];
(注意*b[bufferSize+1]
) - 那麼它將按預期工作..
爲什麼我需要在我的緩衝區數組中有足夠的空間來使指針運算起作用?
也許嘗試削減你的代碼更容易消化的東西?另外,你是否嘗試過使用調試器遍歷代碼? – danfuzz 2014-11-21 04:17:33
對不起,我試圖儘可能多地配對它,同時保留任何可能導致問題 – tmsimont 2014-11-21 21:38:59