2016-05-17 114 views
0

我寫了這個程序:數組指針結構

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

struct inventory{ 
    int ID; 
    char name[20]; 
    int value; 
}; 


int main() 
{ 
    struct inventory *inv; 

    inv = malloc(sizeof(1)); 

    inv[0].ID = 10; 
    strcpy(inv[0].name,"hello charlie old mate"); 
    inv[0].value = 20; 

    inv[1].ID = 20; 

    printf("%d", inv[1].ID); 

    return 0; 
    } 

你能告訴我怎樣才能inv[1].ID被設置爲20.當我爲inv僅配置了1個存儲字節。它如何攜帶多個結構的數據?

+2

你有沒有聽說過*未定義的行爲*? – haccks

+1

「當我爲inv分配一個字節的內存時」是錯誤的。代碼分配給'sizeof(1)'字節,當然不是1,但更可能是4. – chux

+1

只是爲了詳細說明@chux sir所說的,'sizeof'考慮的是數據類型,而不是_value_,文字'1'是類型'int'。 :) –

回答

1

你能告訴我如何將inv [1] .ID設置爲20.當我爲inv分配了1個字節的內存時。它如何攜帶多個結構的數據?

TL; DR這不可能。

你所看到的是調用undefined behavior的無效內存訪問。 C標準沒有任何內容阻止你編寫訪問無效內存的代碼,但只要你這樣做,瞧!

(通過調用malloc(1))分配給inv的內存是方式少那麼它應該是。因此,基本上,您嘗試訪問不屬於您的內存(您的進程),因此內存爲無效。任何嘗試訪問無效內存都會導致UB。

按照同樣的線索,您已經分配正確的內存,甚至後inv,然後還

strcpy(inv[0].name,"hello charlie old mate"); 

將UB,因爲你想超過20元素複製到具有唯一的大小目的地20(如果你想name被用作字符串),它可以容納19個有效的chars + 1空終止符。正確計算你的記憶要求,並保持在範圍內。

也就是說,在使用返回的指針之前,請檢查返回值malloc()是否成功。

+0

我知道你是什麼意思我喊分配inv = malloc(sizeof(struct inventory)); 所以應該使指針訪問只是一個結構INV [0] 但即使當我添加更多的INV [1],(...)INV [5] 它編譯肯定給出了一些奇怪的答案。看看我的評論頂部與prtscr –

+3

@FenixxReborn是,或。爲了更好,'inv = malloc(sizeof * inv);' –

+0

@FenixxReborn對於已編輯的部分,您__必須知道分配的大小和相應的訪問權限。同樣,C不會阻止你訪問'inv [5]',而你只分配給1個元素,但它會導致UB。 –

3

。在你的代碼未定義的行爲 -

inv = malloc(sizeof(1));  // you allocate size of int 
inv[0].ID = 10; 
strcpy(inv[0].name,"hello charlie old mate"); //copying more than your buffer can hold 

您分配大小相等的int是不夠的結構和訪問未經授權的memory.And那麼strcpy,你嘗試存儲超過內容可用的空間。 name最後可以包含19個字符和'\0'。並且您複製的字符串大於19個字符。