2011-12-15 100 views
-1

動態數組我有一個代碼,這些行C包括:與和困惑*和[]()在C

int i; 
int *serie = malloc(sizeof(int)); 

    for (i = 0; i <= 20; i++){ 
     serie=rand(); 
     printf("%d ",&serie[i]);/* *serie */ 
    } 

它的工作,但我想知道爲什麼,使用malloc我相信我創建動態數組或指針稱爲意甲是到目前爲止我的知識是:

& returns the address 
* returns the content of the adress 

你們用[]固定的數組和使用指針()

通過測試&serie[i]似乎工作,但它不*serie(i)*serie[i]*serie我認爲它不會。

有人可以解釋我這些嗎?

如果我想打印我不應該把*代替&的內容,我想用動態數組您使用[]代替()所以應該*serie[i]&serie[i]

+0

最初的代碼是* serie = rand()仍然不好,但我不知道爲什麼我從serie中刪除*,對此抱歉。 – user1094566 2011-12-15 16:18:16

回答

5

在此代碼中,serie指向整數的指針。與malloc()一行爲它分配空間,以便設置或從*serie獲取整數將起作用。循環似乎錯誤地將返回值rand()(整數)設置爲serie。這特定的行應該是這樣的,在當前的代碼(但是你想要什麼反正它不是):

*serie = rand(); 

因爲rand()返回一個整數,serie孤單是一個指針,指向一個整數。但是,*serie是您可以設置的整數。

printf()中,您試圖以數組的形式訪問serie,但這不起作用,因爲您只分配了一個元素。那麼,它會工作,但只適用於元素零。

如果你想設置和產生20個隨機元素(但使用「動態」數組),你可能會想是這樣的:

int i; 
// note allocating the proper number of elements 
int *serie = malloc(sizeof(int) * 20); 

// note starting at and going < 20 for 20 elements 
for (i = 0; i < 20; i++) { 
    serie[i] = rand(); 
    printf("%d ", serie[i]); // *(serie + i) will also work here 
} 

請注意,任何時候你用方括號來訪問一個元素,它取消引用它,很像*。所以serie[i]*(serie + i)在功能上是等效的。

+0

是的丹你是對的,它實際上就是這樣* serie = rand()檢查這個:http://stackoverflow.com/questions/8514049/time-h-works-in-c-not-in-c莫名其妙我刪除,但我不希望我認爲你是對的兩次。 – user1094566 2011-12-15 16:16:57

0

* serie是serie [0]的另一個名字。 *(serie + 1)是serie [1]的另一個名稱。他們都編譯到相同的機器碼。使用任何使自己的代碼最具可讀性的方法對象數組?使用 []。指向字符串的指針?使用 *。

0

這看起來可怕的破壞:

  1. serie=rand();一個整數(的rand()返回值)分配到一個整數指針,很難說是明智的或有效的事情。
  2. &serie[i]讀取隨機存儲器,因爲您用隨機數覆蓋了指針。
1
With fixed arrays you use [] and with pointers() 

不正確。您可以針對指針和固定數組使用相同的語法。

要獲得i的值:個元素的數組中的系列,你可以一次:

serie[i] 

*(serie + i) 
+0

謝謝Klas,是的,兩個sintax都很好。 – user1094566 2011-12-15 16:26:48

1

FYI ...二線聲明一個指向整數,併爲整數分配空間。但是,由於這並沒有被釋放,所以內存泄漏了。

所分配的存儲器是不是在所有的使用,因爲serie稍後重新分配給一個隨機存儲器位置(記住,serie是一個指向一個int,不是int本身,所以蘭特()被分配隨機存儲器地址)。

數組語法將指針取消引用值,正如星號一樣。 serie是一個指向int的指針。 *serieserie[0]都是由serie指向的位置處的值。 serie[i]是位置i處的整數值,它不再是指針。

&serie[i]正在打印一個整數的地址,該整數是從隨機位置開始的i整數。 *serie[i]嘗試將指針取消引用兩次,一次使用方括號,再次使用星號,這可能不是您想要的。