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

时间:2016-04-25 19:13:11

标签: c++

我只是编写程序。我尝试用指针制作它。从函数参数是没有索引的大写到小写的程序。问题在于价值的变化,我的程序正在崩溃......

#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);不是一个好方法吗?

2 个答案:

答案 0 :(得分:2)

这是C ++代码,所以:

char * nap = "aBCDEFGHI";

应该是

const char * nap = "aBCDEFGHI";

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

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

也是未定义的行为,可能导致崩溃。

删除UB的最小变化是将nap定义为数组:

char nap[] = "aBCDEFGHI";

答案 1 :(得分:2)

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

char * nap = "aBCDEFGHI";

您的主要问题是您正在尝试在运行时修改字符串文字。它的Undefined Behavior是这样做的。见Why is this string reversal C code causing a segmentation fault?

answer解释了您的解决方法。

  

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

本身并不是那么糟糕。但你可能会遇到麻烦...这条线是有效的......

*nap = *reinterpret_cast<char*>(const_cast<char*>(nap+32));
C风格的演员是一个无情的演员。正如您所看到的,您还丢弃了所有const和/或volatile条件......有些代码库会受到损害,特别是如果对象存储在只读标记的内存中。 ..见When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?