2011-11-29 41 views
2

我在下面創建了一個代碼,我需要跟蹤一個數組,增加指向數組的指針,並在數組結束時停止。如果我的指針跨越數組邊界會發生什麼?

我使用下面的代碼進行了測試,顯然在增加ptr和打印*ptr 1000次迭代後,我得到0作爲值。

所以它是真的數組的最後一個元素將總是0?我怎麼能告訴ptr停在最後一個元素,如果數組長度創建dynamicaly(我不允許使用鏈接列表)?恐怕如果我使用下面的代碼,有一天我會遇到printf i = 1000,並且它返回給我隨機存儲器位置(對於下面的代碼,這是不正確的,但是誰知道)..

#include <stdio.h> 

int my_array[] = {1,23,17,4,-5,100}; 
int *ptr; 

int main(void) 
{ 
    int i; 
    ptr = &my_array[0];  /* point our pointer to the first 
             element of the array */ 
    printf("value of ptr is %d\n", *ptr); 
    for(i=0; i<1000; i++){ 
     ptr++; 
    } 
    printf("value of ptr is now %d", *ptr); 

    return 0; 
} 
自己

sizeof(my_array)/sizeof(int) 

回答

4

所以這是真的數組的最後一個元素將始終爲「0」?

不,這只是純粹的運氣。你正在從隨機的位置讀取你的記憶,你甚至可能以分段錯誤結束,導致你的程序被毀。

您應該始終確保不讀取/寫入數組的邊界,否則可能會發生非常糟糕的情況(分段錯誤可能是最差的錯誤)。

您可以通過跟蹤您的數組中的項目數的:sizeof(my_array)/sizeof(int)

+0

不是隨機的,只是未初始化或被別的東西初始化。 – hugomg

0

你應該控制數組大小你6個元素製作的磁盤陣列。通過訪問陣列的第7個元素(array[6])你崩潰程序

+0

*您可以*崩潰的程序。 OPs程序顯然沒有崩潰(尚未) – hugomg

2

不,你不能提領你過去的數組的末尾元素;這是未定義的行爲。

做到這一點的一種方法是注意數組中有sizeof(my_array)/sizeof(my_array[0])個元素。

1

您需要通過傳遞附加參數來跟蹤動態數組大小。陣列之後的內存無法保證。

0終止僅用於字符串。

2

所以這是真的數組的最後一個元素將始終爲「0」?

不,你是不吉利的,代碼沒有打破。

我怎麼能告訴PTR停在最後一個元素,如果dynamicaly創建

不可能的數組的數組的長度。您需要知道數組的大小並對其進行迭代。

1

我不會依賴於數組之後有0的事實,因爲內存管理從平臺變爲平臺。

因爲你是一個聲明數組,你應該知道它有多長,所以你可以在技術上說:

for(i = 0; i < 6; i++) 

如果你不知道數組的大小,可以隨時使用sizeof操作符是這樣的:

// (sizeof my_array) will return the total size of the array in bytes 
// (sizeof my_array[0]) will return the size of one element in bytes 
// Dividing the two sizes in bytes will give you the total size. 

int array_size = (sizeof my_array)/(sizeof my_array[0]); 
for(i = 0; i < array_size; i++) 

我的C++是有點生疏,但應該做的伎倆:)

相關問題