看看这道面试题.............

ilbj 2003-09-12 02:10:08
char* a = NULL;
char* b = "123";
strcpy(b, a);
问b现为何值?

能分析一下吗,关于strcpy?
...全文
31 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
w803007 2003-11-06
  • 打赏
  • 举报
回复
hehe
Bandry 2003-10-22
  • 打赏
  • 举报
回复
说过很多次了,还说
scatzr 2003-10-22
  • 打赏
  • 举报
回复
老大,这种问题也拿来讨论的津津有味,真是服了你们了
Wolf0403 2003-10-21
  • 打赏
  • 举报
回复
strcpy 设计为尽量的简单,这样可以在很多时候达到效率最大化:譬如在已经有内存池或者什么别的已经分配好缓冲区的环境下,在进行内存分配是多此一举。
TianGuangZao 2003-10-21
  • 打赏
  • 举报
回复
to Andy84920(你也不懂):
to layman11(羚羊):
这是 strcpy 正规写法,不信可以去看看它的源码。
一般的标准库函数都被设计的足够简单,用来完成一些基本的任务。
strcpy 不会管 dst 指针所指向的空间是否足够,它只管负责拷贝。
检查空间的责任落到了编程者的肩上,你必须在使用 strcpy 前,确保目标有足够的空间。
很多新手在不熟悉库函数的情况下,想当然,往往会碰到很多奇怪的错误。

修改字符串常量是未定义行为,这个问题以前讨论过很长一个贴。
这里就不再罗嗦了。
Jinhao 2003-10-21
  • 打赏
  • 举报
回复
char* b = "123"; == const char* b="123";
"123"是被放在静态储存区中,常量一个
layman11 2003-10-21
  • 打赏
  • 举报
回复
那位老大写的
; Algorithm:
; char * strcpy (char * dst, char * src)
; {
; char * cp = dst;
;
; while( *cp++ = *src++ )
; ; /* Copy src over dst */
; return( dst );
; }

也是有错误的,没有考虑目的字符串和源字符串的长度问题导致的溢出问题,
应该先释放目的字符串指针指向的空间,申请源字符串长度+1的新空间,再
拷贝.
xyc6838 2003-10-21
  • 打赏
  • 举报
回复
关注
joyself 2003-10-21
  • 打赏
  • 举报
回复
将strcpy(b,a)改为 b = a; 如果我们取b的值发现程序没有问题,不然出现
运行错误, 说明不能取保NULL指针指向的值.

应为不取b的值没问题, 取b的值就不行拉, 因为指针是NULL
joyself 2003-10-21
  • 打赏
  • 举报
回复
对,楼上所言既是.
strcpy的两个基本实参都不对的.

对于 char *b = "456",我想是这样的, 指针b的值是可以改变的,但指针所指向的
值是不能变的

所以楼上友人说的:
________________________________________
不过写成 char *b = "123"; 也可以。

为什么"123"是个字符串常量,它还可以被改变呢?

EG: b[0] = 'a';
之类的操作.
________________________________________
是不对的.可以简单的写个程序验证哦

将strcpy(b,a)改为 b = a; 如果我们取b的值发现程序没有问题,不然出现
运行错误, 说明不能取保NULL指针指向的值.

如果将 char *a = NULL;改为 char *a = "456";
b = a;
取b的值就是456了, 因为b被赋为a了










langzi8818 2003-10-21
  • 打赏
  • 举报
回复
第一,这个函数不能传NULL
第二,b是一个指向常量的指针,他的内容是不可以改变的
firedevil 2003-10-21
  • 打赏
  • 举报
回复
不错
Andy84920 2003-10-21
  • 打赏
  • 举报
回复
二 分配内存并不是有 strcpy 来完成的,这不是它关心的。所以需要你自己考虑溢出问题。

分配内存是怎么处理的?不是在strcpy内部申请空间的吗?


不过写成 char *b = "123"; 也可以。

为什么"123"是个字符串常量,它还可以被改变呢?

EG: b[0] = 'a';
之类的操作.
TianGuangZao 2003-10-21
  • 打赏
  • 举报
回复
一 没错,传递 NULL 指针无意义,可以直接:
char* a = NULL;
char* b = "123";
b = NULL;

二 分配内存并不是有 strcpy 来完成的,这不是它关心的。所以需要你自己考虑溢出问题。

三 char * b = "123"; 中 b 不是字符串常量,b 是指向字符或字符串的指针。
字符串常量 "123" 并没有赋给 b,而是把字符串的首个字符的地址赋值给指针 b 或讲成 b 指向字符串的首地址。

正规的写法是:const char *b = "123"; 更加安全些。
不过写成 char *b = "123"; 也可以。
Andy84920 2003-10-21
  • 打赏
  • 举报
回复
为什么说b的地址是不可写的?
我认为一是不能传递给函数NULL指针.函数本身这样定义.
二它内部实现是要申请一个a所指的字符串所占的内存大小然后再让b来指向.
那一个NULL指针指向的地方如何来申请它呢?大小是什么呢?
这样就会出现运行时错误!
三我认为b虽然是一个字符串常量但它声明是声明成char *,为什么不可写呢?
又不是 const char * = "123";

我想知道为什么"123"是字符串常量还可以赋给char *,而不用进行强制转换.
我觉得应该是const char * b = "123";这样呀!

谁能解释一下么?
ZhouHM 2003-10-21
  • 打赏
  • 举报
回复
我在tc下可以编译通过也可以运行,搂主的写法确实是很不安全的,但是拿来讨论一下也无妨。我觉得b的值是任意的,主要取决于内存地址 0 的内容为何值,如果为0则b为空,否则是所有非0连续存贮单元的值。但是要注意内存地址 0 的内容不为空的时候是很危险的,因为b所值向的地址不可知,一旦指向其它有用的地址区域,结果不可预料!
jakeye 2003-09-12
  • 打赏
  • 举报
回复
同意.agree
鄢老 2003-09-12
  • 打赏
  • 举报
回复
我试着运行了一下,可以通过编译,但不能运行。不过,你写的那种形式的确很少见,一般是一个指针指向一个变量或数组,在由它的变量或数组来赋指。直接给指针赋指最好少用,因为没有数组和变量的帮助,不好确定指针所指的位置。
Wolf0403 2003-09-12
  • 打赏
  • 举报
回复
呵呵,内存地址 0 到 0x7ffff 吗多少的一段确实是不能读写的
njtu 2003-09-12
  • 打赏
  • 举报
回复
不能给strcpy传空指针,这是函数的约定。如果不遵守这个约定
该函数不保证产生的结果。

; //Algorithm:
; char * strcpy (char * dst, char * src)
; {
; //参数不能是空指针
; assert( src != NULL && dst != NULL);
; char * cp = dst;
;
; while( *cp++ = *src++ )
; ; /* Copy src over dst */
; return( dst );
; }
加载更多回复(8)

69,369

社区成员

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

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