新手请教一个c的问题,关于指针赋初始值

问题描述

新手请教一个c的问题,关于指针赋初始值
#include
int main()
{
char *p=NULL;
scanf(""%s""p);
printf(""%s""p);
return 0;
}
这段代码我在ios的终端下运行就提示Segmentation fault:11
但是不给p赋初值的话。。改称char *p;反而好使了。。为什么。。。
请教别人说是编译器的问题。能不能稍微详细的说一下为什么。。

解决方案

要先弄清楚scanf的参数用途,
这里scanf将要在p指定的地址上写入用户输入的字符串
操作系统装载程序的时候会将虚拟内存地址划分成多个区域,其中包括reserved readonly等是从低地址开始的也就是从0开始,这部分内存程序不能读写,如果试图读写就会出现segment fault
除了一些不能读写的区域外的很大部分是可以被读写。
所以如果指定了p=NULL肯定会出现错误。
但是如果不指定,那p的值由编译器决定,如果p刚好被赋值为可读写区域就不会报错,具体地址可以用printf打印出来看一下。
具体可以看看《链接装载与库》这本书,第十章第一节就讲的这个问题

解决方案二:
好使也不能这样用啊?
与编译器相关的行为。

解决方案三:
char *p=NULL;,指针 p 没有初始化,需要先分配内存空间。
改为 char *p; 是随机值,危害可以更大。

解决方案四:
无论如何,都需要给p申请存储空间。
其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。

解决方案五:

p 没有地址空间。char *p    其实 p=''  是有地址空间的

解决方案六:
要先给p分配空间才行,例如 char p = (char)malloc(80);

解决方案七:
去看看谭浩强的入门级C课本吧。

解决方案八:
char *p = NULL 賦初值的时候, 指针指向内存中0x0000000处,所指向的内存段为0, p因为是一个指针,也就是说指针必须指向一段字节数>0的内存, 而且p指向的是这段内存的首地址!!! 所以在scanf函数之前必须为p指向的内存块分配一定的内存空间 之后才能系统调用为这段内存填充字节; 而且在内存中NULL表示的是两段内存的截断,表示比如说两个字符串共同战友一段连续的内存,NULL表示两个字符串的截断; 这和字符串不同,因为再字符串数组中是以 ‘’作为一个字符串的结束的; 所以 初始化为NULL系统会出错;

不初始化会造成严重的后果, 在code_blocks dev 编译都不能达到预期的效果; 不初始化将导致p指针的值不确定, 导致内存重写, 内存溢出等很多严重问题; 所以慎用 !!

解决方案九:
char *p; 表示定义了一个字符指针,指向未知
向指向未知的地方写东西是不正确的。所以不要认为这叫“好使”。只是暂时恰好没有引起错误而已。定义了指针就要让他指向合法的可用的内存地址。
比如指向malloc返回的地址,或者指向某个数组等等

时间: 2024-09-13 22:42:10

新手请教一个c的问题,关于指针赋初始值的相关文章

新手请教一个问题,AWS的 ec2主机 用 sftp的时候 无法上传文件是什么原因,谁知道?

问题描述 新手请教一个问题,AWS的ec2主机用sftp的时候无法上传文件是什么原因,谁知道?

新手请教一个<s:iterator />迭代调用js方法的问题

问题描述 小弟最近苦于struts2循环调用js的问题 前来请教...//这是源码<s:iterator value="courses" var="c"><div class="label" style="width: 200;"> <input id="CourseTime" value="<s:property value='#c.CourseTime'/&

新手请教一个没面子问题,VB.NET函数嵌套定义问题.

问题描述 我在页面的代码隐藏页里定义一个函数,函数里面要调用几个子函数,由于一些参数的特殊性,这几个子函数只能写在总函数里,可是又担心VB.NET不支持函数嵌套定义.我由于实在是太菜了,单位又节约成本不组织我们培训,现在还在艰难地摸索中.请教各位朋友们关于VB.NET函数嵌套定义问题,希望得到源代码,谢谢!! 解决方案 解决方案二:支持public类型函数名(参数){public类型子函数名(参数){}public类型子函数名(参数){}}我用的是C#,你参考一下,是可以的解决方案三:不知你的参

新手请教一个小问题,关于SocketInputStream

问题描述 新手求指教,在<深入剖析Tomcat>第三章介绍连接器部分提到了这样一个类:SocketInputStream,从网上找结果说是org.apache.catalina.connector.http.SocketInputStream下的,可这个包我怎么也导不进去,请问大侠这个类到底怎么引进项目中,谢谢了! 解决方案 解决方案二:eclipse么?右键选择你的项目-->BuildPath-->configurebuildpath-->librarys-->add

新手请教一个C#调数据库的问题

问题描述 OleDbConnectionoleDBConn=null;OleDbDataAdapterda=null;DataTablem_tableName=newDataTable();;DataSetds=newDataSet();oleDBConn=newOleDbConnection(oleDBConnString);oleDBConn.Open();m_tableName=oleDBConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,nul

java-新手请教一个JAVA问题,急用。

问题描述 新手请教一个JAVA问题,急用. 我用JAVA在一个包中写了MultiThreadMatrix.java和Jiemian.java.MultiThreadMatrix.java是一个并行矩阵计算程序,怎么让Jiemian.java中的一个按钮b3,点击b3执行MultiThreadMatrix.java,并将结果输出在Jiemian.java的文本框中.图中RUN就是b3 MultiThreadMatrix.java的打印的结果是,先让你输入想建立的线程个数,然后输出每个线程计算哪一行

请教一个ToolkitScriptManager不能使用timer控件的问题

问题描述 新手请教一个问题:我使用的vs2010,我的目的是使用AJAXControlToolkit里面的tabcontainer组件,建立ajax的tab选项卡,然后选项卡上面有个label,设定个timer,定时刷新这个label,但是发现要想使用AJAXControlToolkit,就得引用toolkitscriptmanager,但是如果使用timer控件,就得引用ScriptManager,但是2个都引用就会报错说只能引用一个ScriptManager,请问这个问题怎么好解决呢?单独引

oracle-新手请教一个sql查询问题,在线等,谢谢

问题描述 新手请教一个sql查询问题,在线等,谢谢 一张激活表TL_CSU_ACTIVATE_LOG: 一张用户表TV_CSU_USER 现在要查询2014-12to2015-12每月注册的不同类型(T,B,M,D)用户数,如下图: sql 应该怎么写 解决方案 参考Oracle行列转换 因为你的类型是固定的,所以直接查询,如果你的类型不固定,可以参考上面的链接. SELECT TT.Month ,SUM(CASE WHEN TT.TYPE = 'B' THEN Count ELSE 0 END

jsonp-新手请教一个有关JSONP跨域的问题

问题描述 新手请教一个有关JSONP跨域的问题 请问一下,使用JSONP必须得有后台的支持吗?如果是不能修改的后台怎么办?比如调用微信的接口.自己写一段后台代码放在本地,再在这个文件中去调用远程接口? 解决方案 做代理,或者使用Yahoo的yql也行,可以帮你讲跨域数据转为jsonp格式的数据