请教关于c语言变量的声明和定义

Samerol_Jomior 2013-10-09 07:34:15
如果我声明变量和指针
int a ;
int * p ;

同样是声明没定义,如果修改*p的值就会可能产生严重后果,但是修改a的值却不会,请问这是为什么呢?
...全文
451 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lantian510 2013-10-11
  • 打赏
  • 举报
回复
p是整形变量,使用前需初始化,而a是整形,无须初始化
zhao 2013-10-11
  • 打赏
  • 举报
回复
这里是定义不是申明,另外int *p那么p指向了哪里?你修改了一个未知地址的值你说可不可能会出问题?
Isnis-fallen 2013-10-11
  • 打赏
  • 举报
回复
没有初始化的*p,没有指向内存中的任何一个地址,对它进行赋初值(如果不是一个变量的地址的话)就会出错
drlsdrls 2013-10-11
  • 打赏
  • 举报
回复
这两个都是定义,也就是说都在内存里占用了位置。 至于a被修改不会有问题而*p修改就会有问题一说,我觉得你说得没道理。 如果a是一个关键变量,你随意改动a的值,我保证程序跑的乱七八糟的。
lin51616780 2013-10-10
  • 打赏
  • 举报
回复
int a; int *p; 同样都是 a = 10; p = 46875; 一点问题都没有 安全 不同的是 a不能做 一元运算符*的操作数 p可以做 一元运算符*的操作数 如果你 随便改 a的值 然后做 * 操作 一样死 a = 0; *(int*)a;//死了
赵4老师 2013-10-10
  • 打赏
  • 举报
回复
其实电脑开机后物理内存的每个字节都是可读写的,区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。 崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
lm_whales 2013-10-10
  • 打赏
  • 举报
回复
自动变量,和寄存器变量的定义,其实是一种声明, 他们实际在运行时,函数调用过程中定义,------确定地址,初始化。
lm_whales 2013-10-10
  • 打赏
  • 举报
回复
C语言中: 1) 定义也是声明 2)声明未必是定义。 extern int a;//纯粹的声明 int a; //定义也是声明,外部变量初始化为0; int b = 10;//声明同时初始化,定义。 int main() { int a=10;//声明同时初始化,定义,值确定。 int b;//声明没有初始化,也是定义,局部自动变量,一旦声明就会分配内存。 register c=10;//声明同时初始化,定义,值确定。 register d; //声明没有初始化,定义。值不确定。 //寄存器变量,一旦声明就会分配寄存器或者内存 return 0; }
AnYidan 2013-10-09
  • 打赏
  • 举报
回复
变量一段内存空间,其中可以存储某种类型的数据 指针也是变量,但其中存储某种数据类型的地址
引用 1 楼 booirror 的回复:
这两个都是定义!!! extern int a; 这才是声明
变量一段内存空间,其中可以存储某种类型的数据 指针也是变量,但其中存储某种数据类型的地址
mcmay 2013-10-09
  • 打赏
  • 举报
回复
引用 楼主 u011144614 的回复:
如果我声明变量和指针 int a ; int * p ; 同样是声明没定义,如果修改*p的值就会可能产生严重后果,但是修改a的值却不会,请问这是为什么呢?
没有初始化的*p,没有指向内存中的任何一个地址,对它进行赋初值(如果不是一个变量的地址的话)就会出错。例如,*p = 5;这里5不是某个变量的地址,所以会出现lvalue和rvalue的匹配错误。那么对*p赋的值是个地址,例如,*p = 0x22b40020,这样行吗?这样也不行,0x22b40020固然有可能是内存中存在着的某个地址,但这个地址上的数值是不确定的,也许是其他程序在用的一个值,贸然这样给*p赋这个地址有可能会给*p机会修改这个数值,从而破坏其他程序所要用的数值。 而给a赋值则没问题,例如,a = 5,这是对变量进行初始化。为什么可以这样呢?因为声明了变量a,就意味着在内存中找到了一个地址,例如,0x002c0450,而以这个地址为起始的若干个(多为4个,int一般占用4个字节内存的大小)连续内存单元就用以来存储数值5了。 总之,没有初始化的*p和a的本质区别就是,*p要是想结婚就得发愁,因为单位没有给他分配房子,给他个新娘他都不知让人家住哪里。而a要是想结婚就不用发愁了,因为他刚一进单位,单位已经给他分配房子了,如果有女孩子投怀送抱他就可以随时将人家接入洞房。
图灵狗 2013-10-09
  • 打赏
  • 举报
回复
因为指针是间接操作,所以很有可能改动别的数据。
引用 楼主 u011144614 的回复:
如果我声明变量和指针 int a ; int * p ; 同样是声明没定义,如果修改*p的值就会可能产生严重后果,但是修改a的值却不会,请问这是为什么呢?
booirror 2013-10-09
  • 打赏
  • 举报
回复
这两个都是定义!!! extern int a; 这才是声明

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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