为什么 str[3] 装不下 "Ⅷ" ??
c++吧
全部回复
仅看楼主
level 1
"Ⅷ" 是一个字符串,内容就只有一个全角字符 'Ⅷ',按理说它只占两个字符,再加上结尾的'\0',总共是3位。那么问题来了,为什么用 str[3] 装不下 "Ⅷ" ? Visual Studio报错。。[乖]
2020年03月16日 16点03分 1
level 1
捎带着问另外一个关于字符串数组的问题。如下的一个函数:
char *reduce1(char *src)
{
char temp[1024];
char *save = temp;
strcpy(temp, src);
for(; *save; save++) ; //到字符串的末尾
save --; //退回到倒数第一个非空字符
if(*save) *save = '\0';
save = temp;
return save;
}
按理说这个函数经由指针返回的是本地的字符串数组,是一种未定义行为。然而为什么测试了无数遍,虽然有的编译器会警告,但一直都能够得到
正确的
结果,从来也不会出错?
这个函数,一旦用字符串数组的方式处理(用 temp[i] 替代 *save ),最后仍旧经由 指针 save 返回,则可能会出现错误的结果(乱码或者空串),或者偶尔出错,取决于用的什么编译器:
char *_reduce1(char *src)
{
char temp[1024];
char *save = temp;
int len;
strcpy(temp, src);
len = strlen(temp);
if(len >= 1) temp[len-1] = '\0';
return save;
}
2020年03月16日 17点03分 3
这是我发帖时临时写的两个函数。它是有问题的,问题就在于 temp[1024],1024太长了,比给的字符串 src[]还长,结果,只有VS运行正常。
2020年03月18日 20点03分
[哈哈] [哈哈] [哈哈]
2020年03月19日 23点03分
[哈哈] [哈哈] [哈哈]
2020年03月19日 23点03分
[哈哈] [哈哈] [哈哈]
2020年03月19日 23点03分
level 6
第二个问题 有人跟我说那是编译器做了优化,导致你返回函数销毁局部变量位置不被更改,但是你再试一次那里就可能被更改了。也有人说,那块区域只要没有别的数据侵入就一直是那个残值。
2020年03月17日 02点03分 6
我估计是这样。除非个别编译器特意的退出函数时进行清除栈操作(我感觉这根本没有必要),否则的话,那个位置就一直保存着这个字符串,直到被挤走或覆盖。反正我用Visual Studio测试了上千遍也不出错,可以认为是稳妥可靠的。
2020年03月17日 04点03分
要是按照个别编译器的意思来的话,这个非常简单的函数实现起来却变得相当麻烦。调用时需要额外加一个参数,显得非常别扭。
2020年03月17日 04点03分
@娶个老婆当电脑 小白卑微流泪[泪]
2020年03月17日 05点03分
1 2 3 4 尾页