0xC0000005: 读取位置 0x6C6C6568 时发生访问冲突的原因及解决方法
2017-04-06 10:03
477 查看
程序很简单,就想打印字符串数组中的每一个字符串
void test(char** s, int size) {
for (int i = 0; i < size; i++)
printf("%d:%s\n", i, s[i]);
}
int main() {
char s[4][10] = { "hello", "whatever", "", "like" };
test(s, 4);
}
编译时报警告如下:
1. char **”与“char [4][10]”的间接级别不同
2. “test”: 形参和实参 1 的类型不同
运行时在test函数的printf出现“引发的异常: 0xC0000005: 读取位置 0x6C6C6568 时发生访问冲突”
以i=0为例进行分析
main函数中,s为一个二维数组,test函数中取s[0],认为这是指向"hello"的指针,用printf访问指向的地址并打印内容
但是由于入参s类型为char**,是一个二级指针,因此test函数中取出的s[0]的内容并非指向"hello"的指针,而是 “hello”本身,于是读取前4个字节"hell"内容作为char*,并用printf去访问相应位置内容。但"hell"所指向地址为非法地址(未申请或者根本就不在堆、栈地址区间),因此发生访问冲突。当然,如果执行的是写操作,也会出现些访问冲突。
访问地址冲突可以通过如下初始化s[4][10]来验证
char s[4][10] = { "\x01\x02\x03\x04", "what", "", "like" };
//让s指向地址的前四个字节内容就为"0x01020304"
运行时的异常就变为“引发的异常: 0xC0000005: 读取位置 0x04030201 时发生访问冲突”(也可以看出我的机器是小端机)
正确的初始化方法
char* s[4] = { "hello", "whatever", "", "like" };
或
char* s1="hello";
char* s2="world";
char* s[2]={s1,s2};
另外还有一篇讲二级指针和二维数组实参形参传递的,送上传送门 http://blog.csdn.net/u014624795/article/details/53201710
void test(char** s, int size) {
for (int i = 0; i < size; i++)
printf("%d:%s\n", i, s[i]);
}
int main() {
char s[4][10] = { "hello", "whatever", "", "like" };
test(s, 4);
}
编译时报警告如下:
1. char **”与“char [4][10]”的间接级别不同
2. “test”: 形参和实参 1 的类型不同
运行时在test函数的printf出现“引发的异常: 0xC0000005: 读取位置 0x6C6C6568 时发生访问冲突”
以i=0为例进行分析
main函数中,s为一个二维数组,test函数中取s[0],认为这是指向"hello"的指针,用printf访问指向的地址并打印内容
但是由于入参s类型为char**,是一个二级指针,因此test函数中取出的s[0]的内容并非指向"hello"的指针,而是 “hello”本身,于是读取前4个字节"hell"内容作为char*,并用printf去访问相应位置内容。但"hell"所指向地址为非法地址(未申请或者根本就不在堆、栈地址区间),因此发生访问冲突。当然,如果执行的是写操作,也会出现些访问冲突。
访问地址冲突可以通过如下初始化s[4][10]来验证
char s[4][10] = { "\x01\x02\x03\x04", "what", "", "like" };
//让s指向地址的前四个字节内容就为"0x01020304"
运行时的异常就变为“引发的异常: 0xC0000005: 读取位置 0x04030201 时发生访问冲突”(也可以看出我的机器是小端机)
正确的初始化方法
char* s[4] = { "hello", "whatever", "", "like" };
或
char* s1="hello";
char* s2="world";
char* s[2]={s1,s2};
另外还有一篇讲二级指针和二维数组实参形参传递的,送上传送门 http://blog.csdn.net/u014624795/article/details/53201710
相关文章推荐
- 0xC0000005: 读取位置 0x0000000000000000 时发生访问冲突 异常处理问题解决办法
- 解决xx.exe中的 0x004fd913 处未处理的异常: 0xC0000005: 读取位置 0xfeeefef2 时发生访问冲突
- 未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
- 10_2_4.exe 中的 0x00b0d00a 处有未经处理的异常: 0xC0000005: 读取位置 0xccccccc0 时发生访问冲突
- XXX中的 0x77da15de 处未处理的异常: 0xC0000005: 读取位置 0x00000001 时发生访问冲突
- xxx.exe 中的 0x005d93af (sss.dll) 处最可能的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
- 关于 xxxx.exe 中的 0xxxxxxxx 处最可能的异常: 0xC0000005: 读取位置 0xxxxxxxx 时发生访问冲突
- 0xC0000005: 读取位置 0x00000028 时发生访问冲突
- 0x657ac2b2 (msvcr80d.dll) 处未处理的异常: 0xC0000005: 读取位置 0xccccccc8 时发生访问冲突
- “XXX.exe 中的 0xXXXXXXXX处未处理的异常: 0xC0000005: 读取位置 0xXXXXXXXX 时发生访问冲突”的一种解决方案
- 未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
- 0xC0000005: 读取位置 0x00000020 时发生访问冲突
- D3DXLoadMeshFromXof 0xC0000005: 读取位置 0x00000000 时发生访问冲突
- 0xC0000005: 写入位置 0x00000000 时发生访问冲突的解决办法
- C++“读取位置 0x****** 时发生访问冲突”的可能原因
- 【vs调试】C/C++ 错误处理(文档):未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
- OSG 有未经处理的异常: 0xC0000005: 读取位置 0xcdcdcdcd 时发生访问冲突
- 0xC0000005:读取某位置发生访问冲突;未处理的异常:用户断点
- XXX.exe 中的 0x5404723c (msvcr100d.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0xfeeefee8 时发生访问冲突