如果我的指针越过数组边界会发生什么?

时间:2011-11-29 16:02:51

标签: c arrays pointers

我在下面创建了一个代码,我需要跟踪数组,增加指向数组的指针,并在数组结束时停止。

我使用下面的代码进行了测试,显然在增加ptr和打印*ptr的1000次迭代之后,我得到0作为值。

因此,数组的最后一个元素总是为0吗?如果动态创建数组长度(我不允许使用链接列表),如何告诉ptr停在最后一个元素?我担心,如果我使用下面的代码,有一天我会遇到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;
}

6 个答案:

答案 0 :(得分:4)

  

这是真的,数组的最后一个元素总是“0”吗?

不,这只是纯粹的运气。您正在从内存中的随机位置进行阅读,甚至可能会出现分段错误,从而导致程序被终止。

您应始终确保不会读取/写入数组的边界,否则可能会发生非常糟糕的事情(分段错误可能是最不好的错误)。

您可以使用以下代码跟踪数组中的项目数:sizeof(my_array)/sizeof(int)

答案 1 :(得分:2)

不,您不能在数组末尾取消引用该元素;这是未定义的行为。

一种方法是注意阵列中有sizeof(my_array)/sizeof(my_array[0])个元素。

答案 2 :(得分:2)

  

这是真的,数组的最后一个元素总是“0”吗?

不,你不幸的是代码没有破坏。

  

如果数组长度是动态创建的,那么如何告诉ptr停在最后一个元素

阵列无法实现。你需要知道数组的大小并迭代它。

答案 3 :(得分:1)

您需要通过传递其他参数来自行跟踪动态数组大小。对阵列后的内存无法保证。

0仅为字符串提供终止。

答案 4 :(得分: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 ++有点生疏,但应该这样做:)

答案 5 :(得分:0)

你应该自己控制数组大小

sizeof(my_array)/sizeof(int)

您创建了包含6个元素的数组。通过访问您崩溃程序的数组的第7个元素(array[6]