另一个小记忆C++问题

Another minor memory C++ question

本文关键字:问题 C++ 记忆 另一个      更新时间:2023-10-16
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 *相邻的。在您的情况下,没有,因此您在打印 *(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位指针大小。