我有一个变量,它是一个指向常量char的常量指针的指针。
char const * const * words;
然后我添加了#34; dog"到那个变量。
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'?
}
感谢您的帮助。
答案 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 |
+---+---+---+----+
正如您所看到的,它指向的内存超出了编译器为您分配的内存。取消引用该指针是未定义行为的原因。