2 qq 26025363 qq_26025363 于 2016.09.20 01:12 提问

C++编译报错,写入内存错误

//changeLength2D
#include
#include
using namespace std;
//template
void changeLength2D(int**& a, int oldrow, int copyrow, int copycoloum, int newrow, int newcoloum)
{
if (copyrow > newrow || copycoloum > newcoloum)
//throw("the array is too small");
;
int**temp = new int*[newrow];
for (int i = 0; i < newrow; i++)
temp[i] = new int [newcoloum];

for (int i = 0; i < copyrow; i++)
{
    copy(a[i], a[i] + copycoloum, temp[i]);
    delete[] a[i];
}
for (int i = copyrow; i < oldrow; i++)
    delete[] a[i];
//delete[] a;
a = temp;

}

int main() {
int a[4][4] = { { 1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16} };
int **b=0;

for (int i = 0; i < 4; i++)
b[i] = &a[i][4];
changeLength2D(b, 4, 2, 2, 4, 4);
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
cout << a[i];
cout << endl;
}

return 0;

}

调试后报错是这样的:引发了异常: 写入访问权限冲突。
b 是 0x1110112。
我检查了好像没有内存越界,数组传参对不对?这个不是很理解的透彻!希望有人解答!谢谢额。这是个改变2维数组的函数。

2个回答

feng1790291543
feng1790291543   Ds   Rxr 2016.09.20 07:20

a被delete之后,没有重新分配内存,直接赋值会出错

qq_26025363
qq_26025363 但是调试的时候是到这步进行不下去了。for (int i = 0; i < 4; i++) b[i] = &a[i][4];还没有运行到函数的这部分,应该是这个数组传参的问题把
接近 2 年之前 回复
qq_26025363
qq_26025363   2016.09.20 13:30

我调试后,发现我给b分配的内存是没有的,我指向了0,但是如果不写=0,就会报错没有初始化,请问如何能把b指向a的首地址呢,我试过了好几种赋地址,都是错的。这点把我难住了。

leewers
leewers 而且其实a[i][4]已经越界了,由于声明的时候是int a[4][4],那么下标最大也只能是a[3][3],4就已经越界了。其实在循环里直接写b[i] = a[i]就可以了
接近 2 年之前 回复
leewers
leewers 正确的写法应该是 int ** b = new int*[4]; 随后就可以在循环中正常使用b[i]了。使用完毕后记得delete掉就可以了
接近 2 年之前 回复
leewers
leewers 首先很明显的一个问题,你没有给b分配内存, int** b;仅仅是声明了b,并没有为其分配内存,而后面的循环中你马上使用了b[i],这个必然是会报错的,因为b[i]并没有内存来存放a[i][4]的地址。
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C语言将整形数值存入指定的内存段中的方法
【错误的做法】 下面的做法实际上是将数值1234按照字符串”1234“的方式存入char数组buf的。 int data = 1234; char buf[10]; sprintf(buf, "%d", data); 【正确的做法】 int data = 1234; int data_big_endian = htobe32(data); char buf[10]; mem
C语言 将整数写入内存指定的连续字节单元中
C语言 将整数写入内存指定的连续字节单元中
快速的将一个结构体写入文件--内存映射文件
一篇文章的标题该怎么选择?我个人觉得没有多少什么好的想法。今天选择这个标题是因为自己曾经加入一个讨论c++的QQ群(现在已经被我退群了,有种想再加入的冲动),有人问到怎么样将一个结构体快速的从文件进行读写,那时自己的想法就是打开文件-》读入缓存-》从缓存中读取,虽然觉得这个方法很笨,但是自己也没有好的办法。然而,就在刚才自己在学习面试宝典的过程中,发现了内在映射文件技术。这当然是一个很有历史的技术
清华大学出版社C语言程序第三版
清华大学出版社C语言程序第三版的程序源代码,编译报错的程序
C语言中常见的内存错误与解决方法
C语言中常见的内存错误与解决方法,并举例说明
AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
C#:AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
0xBAADF00D以及常见的Windows内存分配值
0xCD空内存用new或malloc分配但从未被写入过的内存.可以用来发现分配单位使用的内存.0xDD死内存已经用delete或者free释放掉的内存,用来发现挂起的野指针.系统一般会报错0xC0000005访问0xDDDDDDDD出错.0xFD护栏内存这个标志主要是会出现在已分配的内存周围,像栅栏似的,如果你的数组越界的话,一般都会出现
一次内存错误调试总结(平台Cortex-M3)
芯片:STM32F103CBT6 IDE:Keil 调试器:J-Link 操作系统:uCOS 从一开始怀疑硬件问题,到最后定义到内存错误的思路, 有些思维定式。 首先从最开始发现程序有一个地方通不过时,通过断点的逐步调试, 很快发现了是哪里,导致程序没有运行过去。 但是这里没有再继续缩小断点的范围, 从而漏掉了在最短的时间内,将问题
C语言常见的内存错误总结
作者:朱克锋     对c语言的程序员来说,管理和使用内存可能是个困难的、容易出错的任务.与存储器有关的错误属于那些最令人惊恐的错误,因为他们经在运行的时间和空间上都在距错误根源很远的地方才表现出来,程序在最终失败之前已经运行了很长时间,而且程序终止的位置距离出错的位置已经很远了。所以这类错误很难被查出来,也很难发现。但是对于常见的内存错误如果很熟悉的话就会更早的发现与避免错误的发生。下面我总结
尝试读取或写入受保护的内存。这通常指示其他内存已损坏。(System.Data)
文章来自以于:http://blog.sina.com.cn/s/blog_670dd1b10101ikp3.html Sql server2012连接Sql server2008时出现的问题:已成功与服务器建立连接,但在登陆过程中发生错误。(provider:SSLProvider,error:0-接收到的消息异常,或格式不正确。) 以前连接是正常的,就这两天连不上了。(没有