繁体   English   中英

如何使用指针更改数组中的值?

[英]How to change value in array with pointer?

我只是编写程序。 我尝试使用指针来实现。 它是不使用函数参数索引而将大写字母更改为小写字母的程序。 问题在于更改值,我的程序在那崩溃了...

#include <iostream>
#include <cstring>

using namespace std;

char* male(char* nap, int n) {
    for (int i = 0; i < 9; ++i) {
        if (i != n && ((*nap >= 'A') && (*nap <= 'Z'))) {
            *nap = (char)(*nap+32);
        }
        nap++;
    }
    return nap;
}

int main() {

    char * nap = "aBCDEFGHI";
    male(nap, 2);

    return 0;
}

你能告诉我为什么*nap = (char)(*nap+32); 这不是一个好方法吗?

这是C ++代码,因此如下所示:

char * nap = "aBCDEFGHI";

应该

const char * nap = "aBCDEFGHI";

因为字符串文字在C ++中是const。 所以你的代码:

*nap = (char)(*nap+32);

也是不确定的行为,可能导致崩溃。


删除UB的最小更改是将nap定义为数组:

char nap[] = "aBCDEFGHI";

您的编译器应该抱怨这一行...

char * nap = "aBCDEFGHI";

您的主要问题是您试图在运行时修改字符串文字。 这样做的不确定行为 请参阅为什么此字符串反转C代码导致分段错误?

答案说明了您的解决方法。

你能告诉我为什么*nap = (char)(*nap+32); 这不是一个好方法吗?

它本身并没有那么糟糕。 但是您可能会遇到麻烦...这条线实际上是...

*nap = *reinterpret_cast<char*>(const_cast<char*>(nap+32));

C型演员表是无情的演员表。 如您所见,您还抛弃了所有const和/或volatile限定条件。...有些代码库会受到损害,尤其是如果对象存储在只读标记的内存中……请参阅何时应使用static_cast,dynamic_cast ,使用const_cast和reinterpret_cast吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM