2012-03-04 50 views
0

我想兩個變量的地址比較內存變量比較存儲器地址:檢查,並針對不同類型的

chunk_t *old_chunk, *new_chunk; 

    if(&(old_chunk + 1 + old_chunk->size) == &new_chunk) { } 

這裏是原型chunk_t:

typedef struct chunk_tag { 
    struct chunk_tag *next; /* next node in list */ 
    int size; /* size of node in units, not bytes */ 
} chunk_t; 

我得到的編譯器我的if語句有關「左值需要作爲一元操作數」的錯誤。我認爲這是因爲我添加了一個int old_chunk-> size和一個chunk_t old_chunk,所以我在if語句中將type old_chunk-> size作爲chunk_t,編譯器告訴我「轉換爲非標量類型請」

+0

你的new_chunk應該像這樣聲明嗎? new_chunk或* new_chunk? – 2012-03-04 20:37:25

+0

我的錯,它在代碼中被聲明爲一個指針,但是當我重寫它時我有一個錯字。謝謝 – 2012-03-04 20:39:20

+0

你想比較指向'chunk_t'對象的指針地址,還是'chunk_t'對象本身的地址?這是個很大的差異。 – Irfy 2012-03-04 20:44:56

回答

1

您無法獲取計算值的地址。取地址只適用於已經分配到堆棧某處的值。

想象一下,「將12加在一起產生的值的地址是多少?」沒有地址,因爲它是一個計算值。您需要有一個變量或一個計算的內存位置,以便能夠直接操作內存。

從你的代碼是什麼樣子,你想要做你的地址,而不&檢查:

if(old_chunk + 1 + old_chunk->size == new_chunk) { } 

那是因爲你的兩個變量是指針chunk_t對象。

只要確定你知道你在做什麼。將1添加到old_chunk表示在內存後面查找sizeof(chunk_t)字節,比指向old_chunk指向的位置更多。相反,加入old_chunk->size表示看起來sizeof(chunk_t) * old_chunk->size字節之後。

+0

好吧,這是有道理的。兩個vars都有指針,所以爲什麼不是== new_chunk而不是== new_chunk? – 2012-03-04 20:44:29

+0

因爲您錯誤地聲明瞭您的變量,並且稍後更正了您的問題:-) – Irfy 2012-03-04 20:49:13

+0

這很好。我想知道是否添加old_chunk-> size意味着只添加整數*字節。這就是我想要的,添加sizeof(chunk_t)*大小字節。太好了,謝謝! – 2012-03-04 20:52:52

0

下面的表達式

old_chunk + 1 + old_chunk->size 

不是左值,所以你不能把它的地址與&運營商。這是編譯器告訴你的第一條錯誤消息。

第二條錯誤消息告訴您您嘗試進行無效類型轉換。看來你做了這樣的事情:

(chunk_t) old_chunk->size 

這是無效的,如果size是原始類型。

+0

嗯。所以我應該嘗試將該地址保存爲一個變量並與之相比較? – 2012-03-04 20:40:39

+0

@Josh不,你正在考慮錯誤的方式。 – Irfy 2012-03-04 20:41:16

0

你不需要&(old_chunk + 1 + old_chunk->size)。 只需old_chunk + 1 + old_chunk->size。 此外,最好檢查old_chunk->size >= 0是否因爲您在結構中聲明瞭int

P.S.這不是'原型'。這是結構的定義。

+0

好吧,這是有道理的。儘管我有一個關於整數加法的問題,如果old_chunk是一個chunk_t var而old_chunk-> size是一個整數,那麼不會添加整數,只需要添加整數*大小的字節數而不是chunk_t中的字節數*尺寸? – 2012-03-04 20:47:06

0

有一件事是你的new_chunk聲明。它被聲明爲chunk_t,而old_chunk被聲明爲* chunk_t,指向chunk_t的指針。

如果你重新寫你的代碼

chunk_t * old_chunk, *new_chunk; 

if((old_chunk + 1 + old_chunk->size) == new_chunk) { 
    printf("some message"); 
} 

然後它會奏效。或者至少編譯。