2016-05-03 38 views
-6

我有一個函數返回一個數據字,我需要把它放在一個結構體中;然而,當我操縱任何指針時,我不在正確的邊界上。操作指向任意位置的指針

這可能是我更容易顯示:

void grab_object(size_t copies, struct iovec *iov) 
{ 


    union u { 
    long val; 
    char chars[WORD_SIZE]; 
    }data; 

    iov = malloc(sizeof(struct iovec) * copies); 

    size_t numWords = (sizeof(struct iovec) * copies)/WORD_SIZE; 

    if(DEBUG) 
    { 
    printf("numWords %zx\n", numWords); 
    printf("size of word %zx\n", WORD_SIZE); 
    } 

    size_t x = 0; 
    for(x = 0; x < copies; x++) 
    { 
    size_t i = 0; 
    struct iovec *laddr = iov; 
    while(i <= numWords) 
    { 

     data.val = function() 
     memcpy(laddr, data.chars, WORD_SIZE); 
     laddr += WORD_SIZE; 
     i++; 
    } 

    size_t remainder = size % (WORD_SIZE); 
    if(remainder != 0) 
    { 
     data.val = function(); 
     memcpy(laddr, data.chars, remainder); 
    } 
    } 
} 

這將數據複製到結構的第一個元素;然而,它不在第二。

當我打印的元素的地址和LADDR我得到類似如下的內容:在之間

iov_len loc: 0x9a5148 
starting laddr: 0x9a5140 
after incrementing laddr: 0x9a5150 
iov_len loc: 0x9a5148 
starting laddr: 0x9a5150 
after incrementing laddr: 0x9a5160 

那麼爲什麼LADDR遞增的,而不是由1通過0x10的,我怎麼會複製」 「數據(iov_len)?

+0

該代碼似乎無限遞歸 - 它以'void function()'開始,並且在for()'循環的第一行中有'_U.val = function();' - 哪些調用'function()',它啓動另一個調用'function()'的for()'循環。 –

+1

您需要發佈實際編譯的完整代碼集。請參見[最小完整可驗證示例](http://stackoverflow.com/help/mcve)。 – user3386109

+0

@ user3386109已更新 – SailorCire

回答

-2

因此,如user31264暗示,laddr增加了struct iovec的大小。

簡單的解決方案是使用均勻分成struct iovec大小的數據類型。幸運的是,字符總是1個字節。所以:

char *laddr = (char *)iov; 

宣佈我們的容器和

laddr += sizeof(long); 

用一個詞來遞增。

+0

...誰低估了我自己的答案?至少留下評論爲什麼它不好。 – SailorCire

0
char *chars[sizeof(long)]; 

聲明指向字符的指針數組。

你應該寫,而不是

char chars[sizeof(long)]; 

PS:原作者固定這一點,但他有更多的問題,他的代碼。

+0

你是對的,我在我的代碼中有這種方式。我只是沒有正確複製它。 – SailorCire

+2

製作一個可用的代碼(問題除外),然後用鼠標複製它。目前,在「struct * data = malloc(sizeof(struct));」中,sizeof(struct)沒有意義,所以代碼甚至不會編譯。我不知道你在複製中犯了多少錯誤。 – user31264