【问题标题】:Moving array pointer isn't changing ADDRESS of start移动数组指针不改变起始地址
【发布时间】:2017-03-05 13:43:29
【问题描述】:

我的代码:

#include <iostream>

using namespace std;

int main() {
    char *test = (char*)malloc(sizeof(char)*9);
    test = "testArry";
    cout << &test << " | " << test << endl;
    test++;
    cout << &test << " | " << test << endl;
    return 1;
}

结果:

004FF804 | testArry
004FF804 | estArry

我不明白我怎么可能移动了我的数组指针并且地址没有改变。

【问题讨论】:

  • &amp;testtest 本身的地址,而不是它所指向的地址。
  • 好的,正如我所想,但我怎样才能得到我正在寻找的地址?
  • 请注意,C++ 中从不使用 malloc。
  • @Yas - 您可能想检查答案。 :-) 此外,test = "testArry"; 不会将文本移动到您malloc'ed 的内存中,它只是更改指针(并泄漏分配的内存)。您可以永远通过测试弄清楚 C 样式字符串是如何工作的,您将必须阅读它(例如strcpy)。否则使用 C++ std::string 并避免很多麻烦。
  • 当我询问它时,没有任何答案。我正在解决一个练习,我只使用来自 c++ 的 IO 进行测试。在练习规则中,他们标记我们不得使用 string.h 和除 char(和 char*)以外的其他数据类型。

标签: c++ arrays string pointers


【解决方案1】:

指针确实发生了变化。你只是不打印它。打印指针test

cout << (void*) test << endl;

&amp;test 是存储test 的内存位置。
test 是您使用test++ 递增的值(即,您没有递增&amp;test)。

当您执行cout &lt;&lt; test 时,被选中的operator&lt;&lt; 的重载是采用const char* 并将其视为C 样式字符串,打印它指向的字符。转换为void* 避免了这种行为,以便打印test 的实际值,而不是它指向的值。

【讨论】:

  • 说一下为什么要投到(void*) 可能是个好主意
【解决方案2】:

在此声明中

cout << &test << " | " << test << endl;

表达式&amp;test 产生变量test 本身的地址,显然没有改变。它是存储在变量中的值被更改了。

如果要输出变量test 的值,即指向字符串文字内部的值,则应编写

cout << ( void * )test << " | " << test << endl;

考虑到程序中存在内存泄漏,因为在分配内存后,指针被重新分配。并且 sting 字面量具有常量字符数组的类型。所以指针测试应该声明为

const char *test;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 2021-12-29
    • 2022-11-10
    相关资源
    最近更新 更多