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分配内存啊,分配了你怎么回收啊?
而且根本不用给A分配内存啊,分配了你怎么回收啊?
#7
越界了。
#8
"必须要有一个强制的结束条件",强制的结束条件是指什么??
#9
累加数组和dp的时候用的到。
给A释放掉内存的话,delete[] A;不就行了吗?
#10
delete[] A;释放不掉吗?delete[] B;也可以吧?
#11
你A指针都变掉了还怎么delete
#12
new A 本身就是错误了
你要用的是B
A只是入口,懂了吗?
你要用的是B
A只是入口,懂了吗?
#13
int *A = new int[n+1]+1;
不就可以了???
A[-1]=0;
....
delete [](A+1);
PS:
你的这种方法,会导致内存泄漏,为A分配的内存;
没有指针持有,这段内存丢失了,无法释放内存了,这不就是典型的内存泄漏吗????
不就可以了???
A[-1]=0;
....
delete [](A+1);
为了使访问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
int *A = new int[n+1]+1;
不就可以了???
A[-1]=0;
....
delete [](A+1);
为了使访问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
int *A = new int[n+1]+1;
不就可以了???
A[-1]=0;
....
delete [](A+1);
为了使访问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分配内存啊,分配了你怎么回收啊?
而且根本不用给A分配内存啊,分配了你怎么回收啊?
#7
int a[10];
a[-1] = a +10 -1;
//负数是可以的 亲
越界了。
#8
为了访问越界正常,而开另一个数组,这本身就不是正常的逻辑思维方式。难道你只考虑负一正常吗?负二呢?等等。这样考虑下去是没有穷尽的。必须要有一个强制的结束条件,使你的逻辑不要无限的发散开来,这个强制条件就是不要越界访问,注意你代码的逻辑正确性。
"必须要有一个强制的结束条件",强制的结束条件是指什么??
#9
没事干研究这有意义么?
而且根本不用给A分配内存啊,分配了你怎么回收啊?
累加数组和dp的时候用的到。
给A释放掉内存的话,delete[] A;不就行了吗?
#10
像它这么写,要怎么释放掉A数组?
delete[] A;释放不掉吗?delete[] B;也可以吧?
#11
像它这么写,要怎么释放掉A数组?
delete[] A;释放不掉吗?delete[] B;也可以吧?
你A指针都变掉了还怎么delete
#12
new A 本身就是错误了
你要用的是B
A只是入口,懂了吗?
你要用的是B
A只是入口,懂了吗?
#13
int *A = new int[n+1]+1;
不就可以了???
A[-1]=0;
....
delete [](A+1);
PS:
你的这种方法,会导致内存泄漏,为A分配的内存;
没有指针持有,这段内存丢失了,无法释放内存了,这不就是典型的内存泄漏吗????
不就可以了???
A[-1]=0;
....
delete [](A+1);
为了使访问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
int *A = new int[n+1]+1;
不就可以了???
A[-1]=0;
....
delete [](A+1);
为了使访问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
int *A = new int[n+1]+1;
不就可以了???
A[-1]=0;
....
delete [](A+1);
为了使访问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;
}