越界访问数组

时间:2022-04-28 19:30:25
为了使访问A[-1]的行为安全,可以这样做:

int n;
cin>>n;
int *A = new int[n];
int *B = new int[n+1];
A = B +1;
A[-1] = 0;
然后初始化A数组,B数组在下面的程序中没有用到。

问题:为了使A[-1]安全,就必须开辟一个B的数组吗?有没有其他的方法?或者可以使B的数组开的小一点?

16 个解决方案

#1


直接A++就可以了,只不过就不能访问A[n-1]了

#2


像它这么写,要怎么释放掉A数组?

#3


为了访问越界正常,而开另一个数组,这本身就不是正常的逻辑思维方式。难道你只考虑负一正常吗?负二呢?等等。这样考虑下去是没有穷尽的。必须要有一个强制的结束条件,使你的逻辑不要无限的发散开来,这个强制条件就是不要越界访问,注意你代码的逻辑正确性。

#4



int a[10];

a[-1] = a +10 -1;
//负数是可以的 亲

#5


强制结束 越界访问数组

#6


没事干研究这有意义么?
而且根本不用给A分配内存啊,分配了你怎么回收啊?

#7


引用 4 楼 max_min_ 的回复:

int a[10];

a[-1] = a +10 -1;
//负数是可以的 亲

越界了。

#8


引用 3 楼 huayehanshan 的回复:
为了访问越界正常,而开另一个数组,这本身就不是正常的逻辑思维方式。难道你只考虑负一正常吗?负二呢?等等。这样考虑下去是没有穷尽的。必须要有一个强制的结束条件,使你的逻辑不要无限的发散开来,这个强制条件就是不要越界访问,注意你代码的逻辑正确性。

"必须要有一个强制的结束条件",强制的结束条件是指什么??

#9


引用 6 楼 nice_cxf 的回复:
没事干研究这有意义么?
而且根本不用给A分配内存啊,分配了你怎么回收啊?

累加数组和dp的时候用的到。
给A释放掉内存的话,delete[] A;不就行了吗?

#10


引用 2 楼 czarten 的回复:
像它这么写,要怎么释放掉A数组?

delete[] A;释放不掉吗?delete[] B;也可以吧?

#11


引用 10 楼 qdlgdx_lsy 的回复:
Quote: 引用 2 楼 czarten 的回复:

像它这么写,要怎么释放掉A数组?

delete[] A;释放不掉吗?delete[] B;也可以吧?

你A指针都变掉了还怎么delete

#12


new A 本身就是错误了

你要用的是B

A只是入口,懂了吗?

#13


int *A = new int[n+1]+1;
不就可以了???
A[-1]=0;
....
delete [](A+1);

引用 楼主 qdlgdx_lsy 的回复:
为了使访问A[-1]的行为安全,可以这样做:

int n;
cin>>n;
int *A = new int[n];
int *B = new int[n+1];
A = B +1;
A[-1] = 0;
然后初始化A数组,B数组在下面的程序中没有用到。

问题:为了使A[-1]安全,就必须开辟一个B的数组吗?有没有其他的方法?或者可以使B的数组开的小一点?

PS:
你的这种方法,会导致内存泄漏,为A分配的内存;
没有指针持有,这段内存丢失了,无法释放内存了,这不就是典型的内存泄漏吗???? 

#14


引用 13 楼 lm_whales 的回复:
int *A = new int[n+1]+1;
不就可以了???
A[-1]=0;
....
delete [](A+1);

Quote: 引用 楼主 qdlgdx_lsy 的回复:

为了使访问A[-1]的行为安全,可以这样做:

int n;
cin>>n;
int *A = new int[n];
int *B = new int[n+1];
A = B +1;
A[-1] = 0;
然后初始化A数组,B数组在下面的程序中没有用到。

问题:为了使A[-1]安全,就必须开辟一个B的数组吗?有没有其他的方法?或者可以使B的数组开的小一点?

PS:
你的这种方法,会导致内存泄漏,为A分配的内存;
没有指针持有,这段内存丢失了,无法释放内存了,这不就是典型的内存泄漏吗???? 

学到了很多,thank you.
delete [](A+1);不应该是delete[] (A-1);吗?

#15


引用 14 楼 qdlgdx_lsy 的回复:
Quote: 引用 13 楼 lm_whales 的回复:

int *A = new int[n+1]+1;
不就可以了???
A[-1]=0;
....
delete [](A+1);

Quote: 引用 楼主 qdlgdx_lsy 的回复:

为了使访问A[-1]的行为安全,可以这样做:

int n;
cin>>n;
int *A = new int[n];
int *B = new int[n+1];
A = B +1;
A[-1] = 0;
然后初始化A数组,B数组在下面的程序中没有用到。

问题:为了使A[-1]安全,就必须开辟一个B的数组吗?有没有其他的方法?或者可以使B的数组开的小一点?

PS:
你的这种方法,会导致内存泄漏,为A分配的内存;
没有指针持有,这段内存丢失了,无法释放内存了,这不就是典型的内存泄漏吗???? 

学到了很多,thank you.
delete [](A+1);不应该是delete[] (A-1);吗?


应该是 
delete[] (A-1);
这里,确实搞错了,抱歉! 

#16



int a[10];
int * const p = a + 1;
for(int i = -1; i < 9; ++i)
{
  //p[-1], p[0], .... p[8]
  p[i] = 0;
}

#1


直接A++就可以了,只不过就不能访问A[n-1]了

#2


像它这么写,要怎么释放掉A数组?

#3


为了访问越界正常,而开另一个数组,这本身就不是正常的逻辑思维方式。难道你只考虑负一正常吗?负二呢?等等。这样考虑下去是没有穷尽的。必须要有一个强制的结束条件,使你的逻辑不要无限的发散开来,这个强制条件就是不要越界访问,注意你代码的逻辑正确性。

#4



int a[10];

a[-1] = a +10 -1;
//负数是可以的 亲

#5


强制结束 越界访问数组

#6


没事干研究这有意义么?
而且根本不用给A分配内存啊,分配了你怎么回收啊?

#7


引用 4 楼 max_min_ 的回复:

int a[10];

a[-1] = a +10 -1;
//负数是可以的 亲

越界了。

#8


引用 3 楼 huayehanshan 的回复:
为了访问越界正常,而开另一个数组,这本身就不是正常的逻辑思维方式。难道你只考虑负一正常吗?负二呢?等等。这样考虑下去是没有穷尽的。必须要有一个强制的结束条件,使你的逻辑不要无限的发散开来,这个强制条件就是不要越界访问,注意你代码的逻辑正确性。

"必须要有一个强制的结束条件",强制的结束条件是指什么??

#9


引用 6 楼 nice_cxf 的回复:
没事干研究这有意义么?
而且根本不用给A分配内存啊,分配了你怎么回收啊?

累加数组和dp的时候用的到。
给A释放掉内存的话,delete[] A;不就行了吗?

#10


引用 2 楼 czarten 的回复:
像它这么写,要怎么释放掉A数组?

delete[] A;释放不掉吗?delete[] B;也可以吧?

#11


引用 10 楼 qdlgdx_lsy 的回复:
Quote: 引用 2 楼 czarten 的回复:

像它这么写,要怎么释放掉A数组?

delete[] A;释放不掉吗?delete[] B;也可以吧?

你A指针都变掉了还怎么delete

#12


new A 本身就是错误了

你要用的是B

A只是入口,懂了吗?

#13


int *A = new int[n+1]+1;
不就可以了???
A[-1]=0;
....
delete [](A+1);

引用 楼主 qdlgdx_lsy 的回复:
为了使访问A[-1]的行为安全,可以这样做:

int n;
cin>>n;
int *A = new int[n];
int *B = new int[n+1];
A = B +1;
A[-1] = 0;
然后初始化A数组,B数组在下面的程序中没有用到。

问题:为了使A[-1]安全,就必须开辟一个B的数组吗?有没有其他的方法?或者可以使B的数组开的小一点?

PS:
你的这种方法,会导致内存泄漏,为A分配的内存;
没有指针持有,这段内存丢失了,无法释放内存了,这不就是典型的内存泄漏吗???? 

#14


引用 13 楼 lm_whales 的回复:
int *A = new int[n+1]+1;
不就可以了???
A[-1]=0;
....
delete [](A+1);

Quote: 引用 楼主 qdlgdx_lsy 的回复:

为了使访问A[-1]的行为安全,可以这样做:

int n;
cin>>n;
int *A = new int[n];
int *B = new int[n+1];
A = B +1;
A[-1] = 0;
然后初始化A数组,B数组在下面的程序中没有用到。

问题:为了使A[-1]安全,就必须开辟一个B的数组吗?有没有其他的方法?或者可以使B的数组开的小一点?

PS:
你的这种方法,会导致内存泄漏,为A分配的内存;
没有指针持有,这段内存丢失了,无法释放内存了,这不就是典型的内存泄漏吗???? 

学到了很多,thank you.
delete [](A+1);不应该是delete[] (A-1);吗?

#15


引用 14 楼 qdlgdx_lsy 的回复:
Quote: 引用 13 楼 lm_whales 的回复:

int *A = new int[n+1]+1;
不就可以了???
A[-1]=0;
....
delete [](A+1);

Quote: 引用 楼主 qdlgdx_lsy 的回复:

为了使访问A[-1]的行为安全,可以这样做:

int n;
cin>>n;
int *A = new int[n];
int *B = new int[n+1];
A = B +1;
A[-1] = 0;
然后初始化A数组,B数组在下面的程序中没有用到。

问题:为了使A[-1]安全,就必须开辟一个B的数组吗?有没有其他的方法?或者可以使B的数组开的小一点?

PS:
你的这种方法,会导致内存泄漏,为A分配的内存;
没有指针持有,这段内存丢失了,无法释放内存了,这不就是典型的内存泄漏吗???? 

学到了很多,thank you.
delete [](A+1);不应该是delete[] (A-1);吗?


应该是 
delete[] (A-1);
这里,确实搞错了,抱歉! 

#16



int a[10];
int * const p = a + 1;
for(int i = -1; i < 9; ++i)
{
  //p[-1], p[0], .... p[8]
  p[i] = 0;
}