【问题标题】:What happens if my pointer crosses the array bounds?如果我的指针越过数组边界会发生什么?
【发布时间】:2012-01-08 23:24:13
【问题描述】:

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

我使用下面的代码进行了测试,显然在增加 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;
}

【问题讨论】:

    标签: c arrays pointers


    【解决方案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++ 有点生疏,但应该可以解决问题 :)

    【讨论】:

      【解决方案2】:

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

      不,你很不幸,代码没有被破坏。

      如果动态创建数组长度,我如何告诉 ptr 在最后一个元素处停止

      数组不可能。您需要知道数组的大小并对其进行迭代。

      【讨论】:

        【解决方案3】:

        您需要通过传递其他参数自己跟踪动态数组大小。数组后的内存没有任何保证。

        0 终止仅适用于字符串。

        【讨论】:

          【解决方案4】:

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

          一种方法是注意您的数组中有sizeof(my_array)/sizeof(my_array[0]) 元素。

          【讨论】:

            【解决方案5】:

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

            不,这只是运气。您正在从内存中的 随机 位置读取数据,您甚至可能会遇到分段错误,从而杀死您的程序。

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

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

            【讨论】:

            • 不是随机的,只是未初始化或被其他东西初始化。
            【解决方案6】:

            你应该自己控制数组大小

            sizeof(my_array)/sizeof(int)
            

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

            【讨论】:

            • 可以使程序崩溃。 OPs 程序显然没有崩溃(还)
            猜你喜欢
            • 1970-01-01
            • 2013-07-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多