2011-11-29 36 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++是有点生疏,但应该做的伎俩:)

相关问题