2014-11-21 28 views
-1
#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]) - 那麼它將按預期工作..

爲什麼我需要在我的緩衝區數組中有足夠的空間來使指針運算起作用?

+1

也許嘗試削減你的代碼更容易消化的東西?另外,你是否嘗試過使用調試器遍歷代碼? – danfuzz 2014-11-21 04:17:33

+0

對不起,我試圖儘可能多地配對它,同時保留任何可能導致問題 – tmsimont 2014-11-21 21:38:59

回答

0

r->buffer = b;是你的問題。 b是一個局部變量,一旦從resource_buffer_new()返回,就會超出範圍。如果你製作了b靜態或分配它,它會沒事的。

+0

的複雜性,這很有意義。我的目標是指向一個數組,每個ResourceBuffer結構的大小不同。我決定改用鏈表 – tmsimont 2014-11-21 21:40:10