讨论华为的一道面试题

clever101
博客专家认证
2007-09-09 12:34:42
从网上看到华为的一道面试题,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{

char * str1="6789";
char * str2="123456789";
strcpy(str1,str2);
printf("str1=%s\n",str1);
printf("str2=%s\n",str2);
return 0;
}

有没有问题?网上的人说华为里面的人说这段代码是对的。

个人意见:字符串常量存在代码段中,这两个字符串是不可写的。char * str1和char * str2只是获取了常量字符串的首地址,所以strcpy根本无法执行。不知大家的看法是怎样,欢迎讨论。

...全文
3176 89 打赏 收藏 转发到动态 举报
写回复
用AI写文章
89 条回复
切换为时间正序
请发表友善的回复…
发表回复
健之 2010-09-30
  • 打赏
  • 举报
回复
这个问题和具体的编译器有关哈。
其实字符串常量编译器在内存中应该也分配空间的。所以字符串6789和123456789都分配空间。
指针str1和str2只是指向这两个串而已,所以只要编译器不对其进行限制,你做什么操作都是可以的。
另外,因为两个串的申明是写在一起的,如果编译器把两个串分配到一起了,则原始的两个串成了:
6789\0123456789\0
再进行拷贝操作,则成为:
123456789\06789\0
所以就会成为str1是123456789,str2是56789,都是在第一个\0结束的串了。
星光伴月 2007-09-13
  • 打赏
  • 举报
回复
C 与 C++ 是不一样的, 各个编译器对C的支持程度也是不一样的, 同理,对C++的支持程度也是不一样的, 另外, Windows下面的编译器 和 Linux下面的编译器也是不一样的.

TC2.0支持标准C,在标准C的结果是:
str1=123456789
str2=56789
这道考题考得就是标准C.
qiuping345 2007-09-13
  • 打赏
  • 举报
回复
我水平不高,但是看着有的回帖的内容,实在是让人觉得非常好笑.
lovingyou 2007-09-13
  • 打赏
  • 举报
回复
char* str1 = "1234";
char* str2 = "abcde";
str1 = str2;
这样做应该是没有问题的吧!
voice008 2007-09-13
  • 打赏
  • 举报
回复
在sco unix下用cc编译的结果是:
str1=123456789
str2=123456789
太奇怪了!
我是苦力 2007-09-13
  • 打赏
  • 举报
回复
lindao0() 同意! 内存地址的问题,被重叠了。
仅仅是地址复制。
nikyandhua 2007-09-12
  • 打赏
  • 举报
回复
哎 理解了。还是编译器的问题呀.
vagrantfish 2007-09-12
  • 打赏
  • 举报
回复
和编译器有关系的
在win-tc(据说是tc2.0的内核)下两个分配的空间是连续的
而在hpunix下的cc中不是连续的
所以打印的结果也不一样
vagrantfish 2007-09-12
  • 打赏
  • 举报
回复

还是上面的代码(printf("str2=%s\n",str2+4);应该为printf("str2=%s\n",str2); 打错了 不好意思);执行平台hpunixIPF
# cc -o test test.c
# ./test
str1[0]=6,
str1[1]=7,
str1[2]=8,
str1[3]=9,
str1[4]=,
str1[5]=,
str1[6]=,
str1[7]=,
str1[8]= ,
str1[9]=,
str1[10]=,
str1[11]=,
str1[12]=~,
str1[13]=,
str1[14]=",

str1[0]=1,
str1[1]=2,
str1[2]=3,
str1[3]=4,
str1[4]=5,
str1[5]=6,
str1[6]=7,
str1[7]=8,
str1[8]=9,
str1[9]=,
str1[10]=,
str1[11]=,
str1[12]=~,
str1[13]=,
str1[14]=",
str2[0]=1,
str2[1]=2,
str2[2]=3,
str2[3]=4,
str2[4]=5,
str2[5]=6,
str2[6]=7,
str2[7]=8,
str2[8]=9,
str1=123456789
str2=123456789
vagrantfish 2007-09-12
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{

char *str1="6789";

char *str2="123456789";
printf("str1[0]=%c,\n",str1[0]);
printf("str1[1]=%c,\n",str1[1]);
printf("str1[2]=%c,\n",str1[2]);
printf("str1[3]=%c,\n",str1[3]);
printf("str1[4]=%c,\n",str1[4]);
printf("str1[5]=%c,\n",str1[5]);
printf("str1[6]=%c,\n",str1[6]);
printf("str1[7]=%c,\n",str1[7]);
printf("str1[8]=%c,\n",str1[8]);
printf("str1[9]=%c,\n",str1[9]);
printf("str1[10]=%c,\n",str1[10]);
printf("str1[11]=%c,\n",str1[11]);
printf("str1[12]=%c,\n",str1[12]);
printf("str1[13]=%c,\n",str1[13]);
printf("str1[14]=%c,\n",str1[14]);


strcpy(str1,str2);

getchar();
printf("str1[0]=%c,\n",str1[0]);
printf("str1[1]=%c,\n",str1[1]);
printf("str1[2]=%c,\n",str1[2]);
printf("str1[3]=%c,\n",str1[3]);
printf("str1[4]=%c,\n",str1[4]);
printf("str1[5]=%c,\n",str1[5]);
printf("str1[6]=%c,\n",str1[6]);
printf("str1[7]=%c,\n",str1[7]);
printf("str1[8]=%c,\n",str1[8]);
getchar();

printf("str2[0]=%c,\n",str2[0]);
printf("str2[1]=%c,\n",str2[1]);
printf("str2[2]=%c,\n",str2[2]);
printf("str2[3]=%c,\n",str2[3]);
printf("str2[4]=%c,\n",str2[4]);
printf("str2[5]=%c,\n",str2[5]);
printf("str2[6]=%c,\n",str2[6]);
printf("str2[7]=%c,\n",str2[7]);
printf("str2[8]=%c,\n",str2[8]);
printf("str1=%s\n",str1);
printf("str2=%s\n",str2+4);

getchar() ;
return 0;
}

---------------
运行结果:(用win-tc编译)
str1[0]=6,
str1[1]=7,
str1[2]=8,
str1[3]=9,
str1[4]= ,
str1[5]=1,
str1[6]=2,
str1[7]=3,
str1[8]=4,
str1[9]=5,
str1[10]=6,
str1[11]=7,
str1[12]=8,
str1[13]=9,
str1[14]= ,
————

str1[0]=1,
str1[1]=2,
str1[2]=3,
str1[3]=4,
str1[4]=5,
str1[5]=6,
str1[6]=7,
str1[7]=8,
str1[8]=9,

------------------
str2[0]=6,
str2[1]=7,
str2[2]=8,
str2[3]=9,
str2[4]= ,
str2[5]=6,
str2[6]=7,
str2[7]=8,
str2[8]=9,





huangyinvhai 2007-09-12
  • 打赏
  • 举报
回复
这两个指针都是指向常量字符串,当然不能改变
LEEQUNG 2007-09-12
  • 打赏
  • 举报
回复
如果没有其他限制条件,把这个作为考题,基本上可以说华为的人白痴.
jinjiajie 2007-09-12
  • 打赏
  • 举报
回复
可编译运行,但一定是错误的程序,因为会修改静态区....
tutu_cloud 2007-09-12
  • 打赏
  • 举报
回复
无论编译或者运行的结果是什么,这个程序都是错误的。

在这个程序中,strcpy实际上是对一个const对象进行写操作,其结果将是“未定义”。也就是说,编译器在这种情况下可以高兴怎样就怎样,即使编译器在这里生成了格式化硬盘的代码,也不能说是编译器的问题,而是写这段程序的人的问题。
flameearth 2007-09-12
  • 打赏
  • 举报
回复
const char *p="sdsdsdsd"const 所所限定的是 p所指向的不能改变
char *const p="sdsdsdsd"const 所限定的是所指向的内容不能改变
clever101 2007-09-12
  • 打赏
  • 举报
回复
其实我想这道题是否可以作为评判一个编译器优劣的标准,看看支持strcpy操作的编译器是哪些呢:tc2.0,win-tc,hpunix下的cc,大都是属于古董级别的编译器,现代一点的编译器,如GCC, VC 6.0及其更高版本都是不支持的。
prgmBaggio 2007-09-11
  • 打赏
  • 举报
回复
这里的字符串放在 ROM 里面
=====================================
不是ROM吧 - -! 只是在软件层做了限制
monstersky 2007-09-11
  • 打赏
  • 举报
回复
看看MFC的运行库参考手册中关于strcpy的例子...(VC6)
Microsoft777 2007-09-11
  • 打赏
  • 举报
回复
这个问题是修改权限的问题
char * str1="6789";
char * str2="123456789";
这里的字符串放在 ROM 里面,不可以修改
char str1[]="6789";
char str2[]="123456789";
这里的字符串放在 RAM 里面的栈区,可以修改
卖萌不杀 2007-09-10
  • 打赏
  • 举报
回复
我在vs2005上试过,不行啊.
enjoyfan()
你是怎么弄得呢?
加载更多回复(69)

69,369

社区成员

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

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