c++ - 另一个小内存 C++ 问题

标签 c++ memory

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)  
}

除了 coutnewline 之外,我一无所获。当我查看 char* 的行为时,我得到的印象是,因为我有第一个字符的地址,所以我可以像数组一样使用 char*,这是事实。但是,对于 char** 这种行为似乎完全不同,当我尝试 k++ 时,它的行为似乎不像数组。这是为什么?

同样,当我尝试 (K + 1) = &b;我收到一个错误,为什么我不能这样做?

最佳答案

k 是指向 char 指针的指针,因此当您推进它时,它不会像您期望的那样沿着字符串向下移动。相反,它现在指向与它指向的那个相邻的 char *。在你的情况下没有,所以你在打印 *(k - 1) 的值时取消引用随机内存位置。

(K + 1) = &b;

上面是一个错误,因为你必须在赋值的左侧有一个左值,它不能是一个临时表达式(右值)。

编辑: 这是一个示例,希望比阅读您所犯的错误更容易理解。

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;
}

关于c++ - 另一个小内存 C++ 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6566539/

相关文章:

c++ - 将堆分配的引用分配给堆栈分配的变量

c# - 在 C# 中生成极大的图像

c++ - std::to_chars编译但未在MacOS/clang上链接

c++ - Boost矩阵的iterator1和iterator2是什么,如何使用?

c++ - 无法使用现代 OpenGL 渲染基本三角形

c - .o 文件中的内存共享

memory - 普通网卡有多少内存?

c++ - 无法在 VS 2013、Windows 8.1 中创建 Win32 控制台应用程序

c++ - 动态加载共享可选对象

C Valgrind 堆栈跟踪失败,线性 malloc 结构数组