一道极难的笔试题,我被鄙视的一塌糊涂,求高人指点
原题:
int main()
{
char str1[]="123";
char str2[]="123456789";
strcpy(str1,str2);
printf("str1:%s\n",str1);
return 0;
}
问:输出是神马?
我的答案:123456789,但是str1会有访问越界。
好了,面试官不屑对我说,是这样么,你好好想想大小端,堆栈吧,我又说了下大小端字节序:大头--低地址存高位;小头:低地址存低位。
面试官让我回来好好研究这道题的答案是神马,反正是答错了。然后跟我说西,西加加基础太差了,不符合要求。
求教大家了
我试了下加长度和减长度copy都会崩,char str1[10],char str2[10]这种预留空间的是可以成功的。
是不是在栈内存中像这种没有预留空间的字符串不允许截断或者增加长度,否则栈会崩?堆内存中就没有这种限制,但是很危险?
[解决办法]
没想明白跟大小端有啥关系
字符串翻转不用栈吧,直接翻转就可以
void reverseStr( char inputp[],int start,int end)
{
char *s = input + start;
char *e = input + end;
while ( s < e )
{
char tmp = *s;
*s = *e;
*e = tmp;
s++;
e--;
}
}
[解决办法]
和 big-endian 没关系,和 stack 有关系。假设 str1,str2 在栈上连续存在,如果 stack 向低地址增长,则内存(从低到高)看起来像这样:^12...9'0'123'0'#,其中 ^ 为 esp 位置,那么 strcpy 的时候会覆盖 # 及后面的内存,导致覆盖数据。
不过没有规定栈往那个方向长,也没有规定上例中 # 后面一定是有意义的数据,所以是否引发问题不可知。要是我被问道的话,我就回答 strcpy 那句引发未定义行为,后面的程序行为没有保证,因此没必要回答输出是什么了。