注册 登录
编程论坛 C++教室

小白提问,俩个输出为啥不同?

ksaira 发布于 2023-03-20 23:40, 236 次点击
#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

6 回复
#2
阳光上的桥2023-03-21 08:38
首先我确实解释不清楚为什么两次输出不同,我也认为输出应该一致才对。

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


第二个因素是函数tttt和main对a进行了固定长度操作之后,没有添加字符串结束符,例如应该在函数tttt末尾添加下面的语句(main类似):
str[10] = '\0';
#3
rjsp2023-03-21 08:38
数组越界存取 属于 未定义行为

#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;
}
#4
ksaira2023-03-21 10:52
回复 3楼 rjsp
对我疑惑的点就在这里,为什么在tttt函数中a的地址当作形参,它可以直接改变后续地址的值,而在main函数中却不可以,同样都是在字符数组长度只有3的时候。
#5
rjsp2023-03-21 12:07
回复 4楼 ksaira
"未定义行为" 没有研究的必要!

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

同理,「未定义行为」本身就是错误的,研究错误怎么样怎么样没有任何意义。
#6
ksaira2023-03-21 15:57
回复 5楼 rjsp
多谢大哥点拨
#7
pvm20002023-03-22 02:22
tttt(a)函数写得有问题。
主函数中字符数组a的长度为3,这样在tttt()中对a有数组越界操作。
1