c ++ - char const * const * - <error reading =“”characters =“”of =“”string =“”>

时间:2018-02-01 16:12:41

标签: c++ pointers char const

我有一个变量,它是一个指向常量char的常量指针的指针。

char const * const * words;

然后我添加了#34; dog&#34;到那个变量。

words = (char const * const *)"dog";

然而,当我调试代码时,它会说出关于单词的内容:

{0x616d7251 Error reading characters of string.}

我的问题是,我如何正确访问该变量的字符,以便记录字符串的每个字符。

以下是一些示例代码:

char const * const *words;
words = (char const * const *)"dog";

for (int i = 0; i < 5; ++i)
{
    char c = (char)words[i]; // Gives me, -52'i symbol', 'd', and then '\0'
    // How do I access the 'o' and 'g'?
}

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

也许你的意思是

char const * const words = "dog";

for (int i = 0; i < strlen(words); ++i)
{
    char c = words[i]; 
}

现在当然在c ++代码中你应该使用std :: string

答案 1 :(得分:1)

您一直错过第二个const

忽略char** word内容,即表示"dog",它是指向单个char的指针。你不会得到一个单词或许多单词,并且施放只是隐藏了问题。

要通过这样的指针访问"dog",您需要采取额外的步骤;创建一个包含word的变量,并将其地址放入Y

答案 2 :(得分:1)

简答:

您的程序有未定义的行为。要删除未定义的行为,请使用:

char const * word = "dog";
for (int i = 0; i < std::strlen(word); ++i)
{
    char c = word[i];
}

char const * word = dog;
char const * const *words = &word;
for (int i = 0; i < std::strlen(*words); ++i)
{
    char c = (*words)[i];
}

答案很长:

您正在强制从char const*转换为char const* const*,并将持有char的内存位置视为持有char const* s。不仅如此,您还使用越界索引访问内存。

假设字符串"dog"保存在某个内存位置(它需要包含空字符的四个字节)并为其指定一个地址。

a1
|
v
+---+---+---+----+
| d | o | g | \0 |
+---+---+---+----+

您可以将地址a1视为char const*类型指针的值。这根本不是问题。但是,使用:

words = (char const * const *)"dog";

您正在处理a1,好像它正在保存char const*类型的对象。

让我们假设您有一台机器使用4个字节作为指针并使用小端指针。

words[0]计算指针。它的价值将是:

 'd' in decimal +
 256 * 'o' in decimal +
 256*256 * 'g' in decimal +
 256*256*256 * '\0' in decimal.

之后,您将该值截断为char,这将返回字符d,这不是太糟糕。当您访问words[1]时会开始有趣的部分(未定义的行为)。

words[1]*(words+1)相同。 words+1求值为指针,其值为地址a2

                 a2
                 |
                 v
+---+---+---+----+
| d | o | g | \0 |
+---+---+---+----+

正如您所看到的,它指向的内存超出了编译器为您分配的内存。取消引用该指针是未定义行为的原因。