非法地址

kevinbest0702 2009-04-23 12:10:36
今天在做一道C题目时,出现了非法地址访问的问题。
想请教内存中那段地址是系统保留的,非法的?谢谢!
...全文
350 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhanghuayi_xiyou 2009-04-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 kevinbest0702 的回复:]

请大家看下面的代码:
struct S
{
int i;
int * p;
};

void main()
{
struct S s;
int * p = &s.i;

p[0] = 4;
p[1] = 3;

s.p = p;

s.p[1] = 1;
s.p[0] = 2;
}
程序运行到最后一句时会崩溃。
原因是s.p指向的变量的地址为3,无法访问。
这个应该是非法地址的问题吧?
[/Quote]

p[1] = 3; 和
s.p[1] = 1; 都应该是非法访问地址。
kevinbest0702 2009-04-23
  • 打赏
  • 举报
回复
这是一道笔试题。
至于我的目的,请仔细看我的提问。谢谢!
kevinbest0702 2009-04-23
  • 打赏
  • 举报
回复
所以我才想问这个非法地址空间的取值范围是多少啊?
子晞 2009-04-23
  • 打赏
  • 举报
回复
程序没有权限无法访问的地址为非法地址,现在的操作系统都会给进程一个虚拟地址空间,然后将该虚拟地址空间映射
到真正的物理空间.如果一个程序试图访问一块没有映射的内存将是是不允许的。
可以试图访问一个非法地址的程序如:

#include <stdio.h>

int main(int argc, char *argv[])
{
int someInt = 3;
int *somePoint;
int *anotherPoint;

somePoint = &someInt;

printf("%d\n", *somePoint);
printf("%d\n", *anotherPoint); /*非法地址 */

return 0;
}
anotherPoint没有被初始化,那么它的地址是不定的,该指针引用一个未知的地址。那么程序可能会崩溃或出错。
Proteas 2009-04-23
  • 打赏
  • 举报
回复
可能是你数组越界了。或者 出现野指针。
要看代码。
Cpp权哥 2009-04-23
  • 打赏
  • 举报
回复
小地址是系统保留的,至少NULL是。
还有一些空间是只读的,比如保存字符串常量的地方。
黑格东东斯基 2009-04-23
  • 打赏
  • 举报
回复
s.p本来就只是表示一个指针地址,使用[0][1]数组肯定会指向错误。

s.p=p; //s.p的值为s结构的开始地址
s.p[1] = 1; // 将s.p的值指向地址为0x1的地址
s.p[0] = 2; // 企图给0x1地址空间赋值,肯定死翘翘
cyldf 2009-04-23
  • 打赏
  • 举报
回复
楼主写这段程序是想实现什么功能?
kevinbest0702 2009-04-23
  • 打赏
  • 举报
回复
这个你就错了!
s.p=p;
这一句代码的意思是指p指针和s.p指针指向的都是同一个内存地址,也就是s.i变量的地址
coldant 2009-04-23
  • 打赏
  • 举报
回复
s.p[1] = 1;
s.p[0] = 2;
没有对p分配空间,当然不能访问,最好在初始化时将指针赋值,或者=null
cyldf 2009-04-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 kevinbest0702 的回复:]

请大家看下面的代码:
struct S
{
int i;
int * p;
};

void main()
{
struct S s;
int * p = &s.i;

p[0] = 4;
p[1] = 3;

s.p = p;

s.p[1] = 1;
s.p[0] = 2;
}
程序运行到最后一句时会崩溃。
原因是s.p指向的变量的地址为3,无法访问。
这个应该是非法地址的问题吧?
[/Quote]
你这个程序真有意思,首先p指向一个整型,后面就变成数组了。
你的struct S中p没有分配空间,对其赋值本来就是不对的。
kevinbest0702 2009-04-23
  • 打赏
  • 举报
回复

请大家看下面的代码:
struct S
{
int i;
int * p;
};

void main()
{
struct S s;
int * p = &s.i;

p[0] = 4;
p[1] = 3;

s.p = p;

s.p[1] = 1;
s.p[0] = 2;
}
程序运行到最后一句时会崩溃。
原因是s.p指向的变量的地址为3,无法访问。
这个应该是非法地址的问题吧?
sagegz 2009-04-23
  • 打赏
  • 举报
回复
把部分代码贴出来瞅瞅.
很有可能是内存越界,因为一般内存地址都是由操作系统进行分配的.
除非你对指定的内存区域直接进行写入.
pathuang68 2009-04-23
  • 打赏
  • 举报
回复
一般是内存越界,也有可能是访问了那一点保留地址。
  • 打赏
  • 举报
回复
更可能是你内存越界,而不是访问了那一点保留地址。

65,182

社区成员

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

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