一个面试题:下面输出结果是什么?

天涯浪子 2006-10-16 12:09:06
main()
{
char *str="1234";
char *str1="123456789";
strcpy(str,str1);
printf("%s,%s",str,str1);
getch();
}

另外,俺公司又招人呢,有意向的可以发简历给我:lorrencele@163.com

华为无线产品线
岗位 :3G软件工程师
工作地:深圳

要求:
1、必须本科或以上学历,硕士毕业1年以上,本科毕业2年以上。
2、计算机或通信相关专业毕业,或者有软件开发相关工作经验。

面试主要考察c、sql、数据结构等。
...全文
1546 65 打赏 收藏 转发到动态 举报
写回复
用AI写文章
65 条回复
切换为时间正序
请发表友善的回复…
发表回复
nyj_vbnet 2006-10-17
  • 打赏
  • 举报
回复
char *str="1234";好像不能改变它的值吧
lgsh_007 2006-10-17
  • 打赏
  • 举报
回复
123456789,6789
我也多些个0
mimong_lin 2006-10-17
  • 打赏
  • 举报
回复
做了,结果如LS的,

不知道那些出来结果的仁兄们是怎么做出来的?用的什么平台?
lgsh_007 2006-10-17
  • 打赏
  • 举报
回复
1234567890,67890
tc下运行的结果!
fresh_micheal 2006-10-17
  • 打赏
  • 举报
回复
lz,你请教的人真是误人子弟:)。你该先了解一下内存对齐是什么(已经被高手办成铁案,随便google一下就能得到),根本跟你这个程序毫无关系。然后记得不要再修改常量区的内容了,就像你的str1覆盖str,str指向的是常量区的内容,不可以修改;若用str数组,则可以,因为内容存放在堆栈中,可赋值,请看strcpy的源代码:

char *strcpy(char *destination, const char *source)
{
while(*destinaton++=*source++);
return (destination-1);
}

kypck_ 2006-10-17
  • 打赏
  • 举报
回复
这种题目,执行结果和编译器有关。有的compiler支持string pooling,有的不支持;有的把这样的字符串放在global data segment,有的放在heap里;根据处理器架构不同,有的会把这些字符串的page加上只读属性,等等。
所以那个strcpy的行为是不可预料的。
以后Huawei及其子公司的内部考题或笔试题,请不要拿出来丢人现眼,谢谢。
huangwc 2006-10-17
  • 打赏
  • 举报
回复
上机测试结果:
VC++6.0
报错
thinkSJ 2006-10-17
  • 打赏
  • 举报
回复
zhuge6_24() ( ) 信誉:100 Blog 2006-10-17 21:42:00 得分: 0
main()
{
char *str="1234";
char *str1="123456789";
strcpy(str,str1);
printf("%s,%s",str,str1);
getch();
}

应该会崩掉!因为"1234"是字面常量,字面常量都是放在系统专门开辟的一块字面常量内存块中,这块内存本身是不可修改的.str指针只是指向这个位置.
改成char str[20] = "1234"; 当然是可以的,因为数组是专门开辟了一块栈内存,然后把字面量"1234"拷贝到这个区域的,因此该区域是可修改的.
可以用这样测试:
char* str = "1234";
char* str1 = "1234";
可以测试str与str1是相等的
而char str2[] = "1234";
char str3[] = "1234";
str2是不会等于str3,也不会等于str的
================================================================================
正解!!
Fyter 2006-10-17
  • 打赏
  • 举报
回复
请理解概念
str,str1都不是常量,它们是字符指针,指向的是字符串常量。

常量是不能被修改的,所以出错。不表示str与str1不能修改。
liujatp 2006-10-17
  • 打赏
  • 举报
回复
str 指向的是常量,指向的内容不可修改,所以strcpy(str,str1)是不能成功的。
qxbnit 2006-10-17
  • 打赏
  • 举报
回复
如果不报错,这个编译器肯定有问题!
JessC 2006-10-17
  • 打赏
  • 举报
回复
楼主,你是想让我们用TC编译吗?
zhuge6_24 2006-10-17
  • 打赏
  • 举报
回复
main()
{
char *str="1234";
char *str1="123456789";
strcpy(str,str1);
printf("%s,%s",str,str1);
getch();
}

应该会崩掉!因为"1234"是字面常量,字面常量都是放在系统专门开辟的一块字面常量内存块中,这块内存本身是不可修改的.str指针只是指向这个位置.
改成char str[20] = "1234"; 当然是可以的,因为数组是专门开辟了一块栈内存,然后把字面量"1234"拷贝到这个区域的,因此该区域是可修改的.
可以用这样测试:
char* str = "1234";
char* str1 = "1234";
可以测试str与str1是相等的
而char str2[] = "1234";
char str3[] = "1234";
str2是不会等于str3,也不会等于str的

这是c语言的基础知识
yuge2008 2006-10-17
  • 打赏
  • 举报
回复
最讨厌讨论错误程序的运行结果
benjiam 2006-10-17
  • 打赏
  • 举报
回复
这个题考了内存中的4字节对齐问题:

但从你写的东西 这不叫四字节对齐

int main(int argc, char* argv[])
{
{
char *str1="123456789";
char *str="1234";
char (*p)[100] = str1;

strcpy(str,str1);
printf("%s \n",str);
printf("%s ", str1);
getch();
}
}
kypck_ 2006-10-17
  • 打赏
  • 举报
回复
高手!!!
===========================================================
答案 我认为 在C中的结果应该是(而且仅是):
1234567896789
因为系统在给指针分配空间时是连续分配的。
在进行strcpy(str,str1) 后,str占用10个空间,str1被迫下移6个空间,
所以,在printf之后只能从6开始。
Over!
qfsb_p 2006-10-17
  • 打赏
  • 举报
回复
呵呵,真有趣
jjwhuangbin 2006-10-17
  • 打赏
  • 举报
回复
答案 我认为 在C中的结果应该是(而且仅是):
1234567896789
因为系统在给指针分配空间时是连续分配的。
在进行strcpy(str,str1) 后,str占用10个空间,str1被迫下移6个空间,
所以,在printf之后只能从6开始。
Over!
lin_style 2006-10-16
  • 打赏
  • 举报
回复
。。本科毕业啊。。。
俺小学
justrun2005 2006-10-16
  • 打赏
  • 举报
回复
哦,按C来,某些是可以的
加载更多回复(45)

64,648

社区成员

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

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