| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 665 人关注过本帖
标题:小白提问,俩个输出为啥不同?
只看楼主 加入收藏
ksaira
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2023-3-20
结帖率:0
收藏
已结贴  问题点数:20 回复次数:6 
小白提问,俩个输出为啥不同?
#include "iostream"
#include "bits/stdc++.h"
using namespace std;
void tttt(char *str){
    for(int i = 0;i < 10;i ++) str[i] = 'a';
}
int main() {
    char a[] = "bb";
    tttt(a);
    cout<<a<<endl;
    for (int i = 0; i < 10; i++)
        a[i] = 'a';
    cout << a;
}
、、、、、、、、、、
output:
aaaaaaaaaa
aaab

搜索更多相关主题的帖子: int 输出 不同 提问 cout 
2023-03-20 23:40
阳光上的桥
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:38
帖 子:129
专家分:772
注 册:2023-1-12
收藏
得分:7 
首先我确实解释不清楚为什么两次输出不同,我也认为输出应该一致才对。

我认为帖子程序对数组(字符串)a初始化为长度太短是闹鬼的一个因素,函数tttt和main对它的操作都太长,如果需要操作10个字符,可以把初始化语句修改为:
char a[11];


第二个因素是函数tttt和main对a进行了固定长度操作之后,没有添加字符串结束符,例如应该在函数tttt末尾添加下面的语句(main类似):
str[10] = '\0';
收到的鲜花
  • rjsp2023-03-21 08:39 送鲜花  5朵  
2023-03-21 08:38
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9029
专家分:54050
注 册:2011-1-18
收藏
得分:7 
数组越界存取 属于 未定义行为

#include <iostream>
using namespace std;

void tttt( char* str )
{
    for( size_t i=0; i!=10; ++i )
        str[i] = 'a';
}
int main( void )
{
    char a[11] = "bb";
    tttt( a );
    a[10] = '\0';
    cout << a << endl;

    for( size_t i=0; i!=10; ++i )
        a[i] = 'a';
    cout << a << endl;
}
2023-03-21 08:38
ksaira
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2023-3-20
收藏
得分:0 
回复 3楼 rjsp
对我疑惑的点就在这里,为什么在tttt函数中a的地址当作形参,它可以直接改变后续地址的值,而在main函数中却不可以,同样都是在字符数组长度只有3的时候。
2023-03-21 10:52
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9029
专家分:54050
注 册:2011-1-18
收藏
得分:0 
回复 4楼 ksaira
"未定义行为" 没有研究的必要!

因为"未定义行为" 就是错误的逻辑,不在 编译器/语言 的考虑范围内。
打个比方,你去 便民站 问路,你说 去北京,别人指一条路;你说 去南京,别人指一条路。但凡别人回答错误,或不理你,或打你一顿,你都可以投诉。因为「问路」是良好定义行为,有严格的行为指导规范。
而如果你去不是问路,而是弹一下别人的小鸡鸡,别人可能不理你、可能骂你一句、可能打你一顿、……,等等有无穷种可能。你回家研究为什么对方 以右脚 而不是左脚,为什么以 37.63牛顿的力 而非 36.84牛顿的力,为什么以 40.12° 而不是 42.11°的方向 踢你。这种研究是没有意义的!

同理,「未定义行为」本身就是错误的,研究错误怎么样怎么样没有任何意义。
2023-03-21 12:07
ksaira
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2023-3-20
收藏
得分:0 
回复 5楼 rjsp
多谢大哥点拨
2023-03-21 15:57
pvm2000
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:180
专家分:312
注 册:2022-12-22
收藏
得分:7 
tttt(a)函数写得有问题。
主函数中字符数组a的长度为3,这样在tttt()中对a有数组越界操作。
2023-03-22 02:22
快速回复:小白提问,俩个输出为啥不同?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032318 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved