另一个小记忆C++问题
Another minor memory C++ question
int main() {
char **k;
char *s ="abc";
char *b ="def";
k = &s;
k++;
k = &b;
cout<<*(k - 1)<<endl; // nothing but newline. Shouldn't I get "abc"?
//EDIT: corrected a typo should be *(k - 1)
}
我只得到了cout
的newline
.当我查看 char* 的行为时,我的印象是,由于我有第一个字符的地址,我可以像数组一样使用 char*,这是真的。但是,对于 char**,这种行为似乎完全不同,当我尝试 k++ 时,它的行为似乎不像数组。为什么?
同样,当我尝试 (K + 1( = &b; 时,我遇到了错误,为什么我不能这样做?
k
是指向字符的指针,因此当您前进它时,它不会像您期望的那样沿着字符串向下移动。相反,它现在指向与它所指向的char *
相邻的。在您的情况下,没有,因此您在打印 *(k - 1)
的值时取消引用随机内存位置。
(K + 1) = &b;
以上是一个错误,因为赋值的左侧必须有一个 l 值,它不能是临时表达式(r 值(。
编辑:这里有一个例子,希望比阅读你所犯的错误更容易理解。
int main()
{
char **k;
char *s[2] = {"abc", "qwerty"};
k = &s[0];
std::cout << *(k + 1) << std::endl; // prints "qwerty"
k++;
std::cout << *(k - 1) << std::endl; // prints "abc"
std::cin.get();
return 0;
}
因为您没有将其指向数组,所以*(k-1)
实际上是在访问不确定的内存并产生未定义的行为。
我将向您的代码添加一些示例值。请注意,我只是为了说明目的而编造的! 我假设一个 32 位(4 字节(指针。
char **k; /* pointer @ 0x1000 */
char *s = "abc"; /* four bytes @ 0x2004 = "abc", pointer @ 0x1020 = 0x2004 */
char *b = "def"; /* four bytes @ 0x2000 = "def", pointer @ 0x1010 = 0x2000 */
k = &s; /* pointer @ 0x1000 now = 0x1020 */
k++; /* pointer @ 0x1000 now = 0x1024 (one char* [4 bytes] more) */
k = &b; /* pointer @ 0x1000 now = 0x1010 */
cout<<*(k - 1)<<endl; /* k-1 = 0x100C ... *(k-1) = ??? */
EDIT修复了k = &...
行中的错误,添加了显式的32位指针大小。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 使用mongocxx驱动程序时包含头文件问题