搜索
首页 电脑/网络 程序设计

c语言中char*的初始化问题

初始化一个字符指针变量,比较两种 第一种:char *a; a = "Hi, you!"; 第二种: char *a; scanf("%s",a); 我听说是这样: 第一种方法是很普通很正常的赋值方法,而第二种赋值很危险,因为a的值未定,完全由你输入的字符串决定,这就有可能因为输入字符串太长破坏了正常的程序或者数据。 但是, 在第一种方法里,a的赋值是在定义的下一句执行的,换句话说,a赋值时同样可能出现和第二种相同的危险。 但为什么说第一种是安全的呢?

全部回答

2008-07-24

0 0
    第二种写法根本就是错的(虽然可以编译)。 问题在于,"Hi, you!"本身是一个字符串常量,跟代码一样是预先分配好内存的,所以第一种情况只是把"H"所在的内存地址复制给变量a而已。
  他跟char a[] = "Hi, you!";意思基本上是一样的。 但是第二句仅仅声明了指针,而没有为字符串预分配内存。  假设a = 0,那么scanf的时候用户的输入就将写入地址0,导致我们常常看到的“内存0x0不能为写”的错误。
   我们假设你的这个程序实际上不是这个意思,完整的写法是: char *a; a = (char *)malloc(256); if (a) { scanf("%s", a); free(a); } 那么用户的输入就不能超过255字节。
    因为a的内容是分配到堆中的,超过256-1这个上限就会覆盖掉堆的其他内容,导致不可预知的后果。 。

2008-07-19

468 0
本人 一点 拙见 第一种 赋值 面向的是程序员,他应该有一定的电脑基础 第二种 赋值 可以面向的是程序的用户,用户不一定有很好的电脑基础,所以在 第二种 赋值的时候 是不确定的!

类似问题换一批

热点推荐

热度TOP

相关推荐
加载中...

热点搜索 换一换

电脑/网络
程序设计
硬件
电脑装机
互联网
操作系统/系统故障
笔记本电脑
反病毒
百度
软件
程序设计
程序设计
VB
数据库
C/C++
汇编语言
JAVA相关
VC++
C#/.NET
其他编程语言
举报
举报原因(必选):
取消确定举报