【问题标题】:Access beyond indexes of allocated memory for pointer [duplicate]超出指针分配内存索引的访问[重复]
【发布时间】:2015-07-22 18:45:41
【问题描述】:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char *p = malloc(10);
    int i;
    for(i=0;i<15;i++)
    {
        p[i]='c';
        printf("INDEX:%d  %c\n",i,p[i]);
    }

    return 0;
}

我不知道为什么在上面的代码中,我只分配了 10 个内存,但我仍然能够访问指针的第 15 个索引。

我不知道为什么,但我认为这是因为这个指针指向一些随机的内存块,我只是覆盖了那部分内存,但我只是分配了特定数量的内存,所以我'不知道为什么它会起作用。

有人可以确认吗?

【问题讨论】:

  • 当你越界时,行为是不确定的。你可能会崩溃,也可能不会。
  • C 不检查数组索引是否越界。你必须照顾它,否则它会导致 UB。

标签: c pointers memory malloc


【解决方案1】:

在 C 中,当您访问索引超出范围的数组时,根据 C 语言,行为未定义,因为 C/C++ 实际上并未对数组进行任何边界检查。它只依赖于操作系统来确保您访问的是有效内存。

为什么您没有看到错误

总之,你是幸运

通常数组分配在相邻的内存地址中。当您添加指针时,编译器将简单地生成代码来访问相邻的内存。由于它仍在您程序的内存空间中,因此操作系统不会为此触发错误。

如何检查此类错误

有一些工具,比如valgrind,还有一些有用的编译器标志可以用来检测其中一些错误。

例如,如果您在valgrind 中运行生成的二进制文件,valgrind 将在写入p[10] 时生成以下消息

==14590== Invalid write of size 1
==14590==    at 0x4005B2: main (in /home/lingkun/Develop/courage/cpp/src/a.out)
==14590==  Address 0x520204a is 0 bytes after a block of size 10 alloc'd
==14590==    at 0x4C2BBA0: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14590==    by 0x400597: main (in /home/lingkun/Develop/courage/cpp/src/a.out)
==14590== 
==14590== Invalid read of size 1
==14590==    at 0x4005C2: main (in /home/lingkun/Develop/courage/cpp/src/a.out)
==14590==  Address 0x520204a is 0 bytes after a block of size 10 alloc'd
==14590==    at 0x4C2BBA0: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==14590==    by 0x400597: main (in /home/lingkun/Develop/courage/cpp/src/a.out)
==14590== 
INDEX:10  c
INDEX:11  c
INDEX:12  c
INDEX:13  c
INDEX:14  c

【讨论】:

  • 不,不走运,运气不好。提前崩溃是一项功能。
【解决方案2】:

我不知道为什么在上面的代码中,我只分配了 10 个内存,但我仍然能够访问指针的第 15 个索引。

访问超出您请求的内存会导致未定义的行为。如果程序没有崩溃,你应该认为自己不走运。它会在最不合时宜的时刻表现得很奇怪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多