指针指向数组,指针自增导致数组越界的现象

ylongwu 2013-06-26 10:29:20
很简单的程序,是这样的:
	int *Array1 = new int[10*sizeof(int)];
int *Array2 = new int[10*sizeof(int)];
for(int i=0; i<10; i++)
{
Array1[i] = i;
}

int*p1 = Array1;
int*p2 = Array2;

for(int i=0; i<10; i++)
{
*p2++ = *p1++;
}


将array1的值传递给array2,这样p1跟p2最终都将超越数组一个元素,请问这种现象会导致程序奔溃吗?

以前我通常是这样来实现的:
	for(int i=0; i<9; i++)
{
*p2++ = *p1++;
}
p2=p2;


请问一般应该使用什么方法?
我的实际数组是三维的,所以用指针依次递增来索引数组应该比用各个维度相乘相加来计算索引要快。
...全文
379 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-06-28
  • 打赏
  • 举报
回复
VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533
赵4老师 2013-06-28
  • 打赏
  • 举报
回复
其实电脑开机后物理内存的每个字节都是可读写的,区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。 操作系统内存管理的粒度不是1字节,通常是4K字节。
赵4老师 2013-06-28
  • 打赏
  • 举报
回复
仅供参考
//在堆中开辟一个3×4×5的3维int数组
#include <stdio.h>
#include <malloc.h>
int ***p;
int i,j,k;
void main() {
    p=(int ***)malloc(3*sizeof(int **));
    if (NULL==p) return;
    for (i=0;i<3;i++) {
        p[i]=(int **)malloc(4*sizeof(int *));
        if (NULL==p[i]) return;
        for (j=0;j<4;j++) {
            p[i][j]=(int *)malloc(5*sizeof(int));
            if (NULL==p[i][j]) return;
        }
    }
    for (i=0;i<3;i++) {
        for (j=0;j<4;j++) {
            for (k=0;k<5;k++) {
                p[i][j][k]=i*20+j*5+k;
            }
        }
    }
    for (i=0;i<3;i++) {
        for (j=0;j<4;j++) {
            for (k=0;k<5;k++) {
                printf(" %2d",p[i][j][k]);
            }
            printf("\n");
        }
        printf("---------------\n");
    }
    for (i=0;i<3;i++) {
        for (j=0;j<4;j++) {
            free(p[i][j]);
        }
        free(p[i]);
    }
    free(p);
}
//  0  1  2  3  4
//  5  6  7  8  9
// 10 11 12 13 14
// 15 16 17 18 19
//---------------
// 20 21 22 23 24
// 25 26 27 28 29
// 30 31 32 33 34
// 35 36 37 38 39
//---------------
// 40 41 42 43 44
// 45 46 47 48 49
// 50 51 52 53 54
// 55 56 57 58 59
//---------------
lm_whales 2013-06-28
  • 打赏
  • 举报
回复
越界崩溃,有几种情况。 1)Debug 版,越界出错,这是为了显示出错,特别处理的结果,这种错误,表示程序的代码写错了,需要修改,由于已经报告了位置,很容易修改。 2)内存保护,访问了保护的内存,这些内存是不可访问的,这个要耐心检查,有可能是访问了NULL指针的地址或者访问了,其他不应该访问的内存。 3)改写了特殊内存区域,如内存分配的数据结构被改写了,整个内存管理机构崩溃了,继续使用动态内存分配会出错,这个是动态分配内存使用不当造成的,检查指针,主要是野指针,或者索引值过大+,过小-。 4)改写了其他数据,造成程序出现致命错误,程序崩溃! 检查是否修改了相邻的变量,或者野指针,或者索引值过大+,过小-
自信男孩 2013-06-26
  • 打赏
  • 举报
回复
引用 7 楼 ylongwu 的回复:
[quote=引用 6 楼 cfjtaishan 的回复:] 数据越界,如果你越界访问很容易造成内存泄露,程序崩溃。控制数组越界,需要自己去控制,C/C++的编译器不会给予提示。
你好,请问上面的指针如果越界了,但是p1,p2一直指向越界的内存,但是没有将p1和p2赋值给其他变量,是否就是说没有越界访问,也不会引起程序崩溃?[/quote] 没有将p1和p2赋值给其他变量,但是如果你打印或者输出p1指向的区域就可能出现内存泄露。若果没有使用,则不会。 我想如果还需要用,你可以让p1和p2从新指向其数据的首地址。当然,这需要根据你的程序逻辑来操作。
赵4老师 2013-06-26
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。 判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。 其实电脑开机后物理内存的每个字节都是可读写的,区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。
ylongwu 2013-06-26
  • 打赏
  • 举报
回复
指针可以指向未知内存,但是不能访问,访问就可能引起崩溃。 指针的实质是一个内存单元内存放着一个地址,这个地址的值可以是随意的, 但是如果你要向这个地址读取或者写入数据,那么这时候你必须确保这个地址不是越界的。
ylongwu 2013-06-26
  • 打赏
  • 举报
回复
引用 6 楼 cfjtaishan 的回复:
数据越界,如果你越界访问很容易造成内存泄露,程序崩溃。控制数组越界,需要自己去控制,C/C++的编译器不会给予提示。
你好,请问上面的指针如果越界了,但是p1,p2一直指向越界的内存,但是没有将p1和p2赋值给其他变量,是否就是说没有越界访问,也不会引起程序崩溃?
自信男孩 2013-06-26
  • 打赏
  • 举报
回复
数据越界,如果你越界访问很容易造成内存泄露,程序崩溃。控制数组越界,需要自己去控制,C/C++的编译器不会给予提示。
farmerwood 2013-06-26
  • 打赏
  • 举报
回复
下标控制好了应该是不会越界的,就算打针越界了只要不取值也不会出错,最后那句 *p2=*p1; 放到循环里面也可以
angel6709 2013-06-26
  • 打赏
  • 举报
回复
越界不越界自己控制
ylongwu 2013-06-26
  • 打赏
  • 举报
回复
引用 2 楼 wzh_xwjh 的回复:
int *Array1 = new int[10*sizeof(int)]; 也错了,用 new 不用乘上 sizeof(int),如果要开 10 个 int 的内存,用 int *Array1 = new int[10]; 就可以
不好意思,脑袋发晕了
farmerwood 2013-06-26
  • 打赏
  • 举报
回复
int *Array1 = new int[10*sizeof(int)]; 也错了,用 new 不用乘上 sizeof(int),如果要开 10 个 int 的内存,用 int *Array1 = new int[10]; 就可以
ylongwu 2013-06-26
  • 打赏
  • 举报
回复
不还意思 上面最后一句错了,应该是:
	for(int i=0; i<9; i++)
	{
		*p2++ = *p1++;
	}
	*p2=*p1;

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧