【问题标题】:C++ what happens when incrementing a char *C++ 增加 char * 时会发生什么
【发布时间】:2015-12-27 06:40:07
【问题描述】:

假设我有以下代码:

void incrementPointer( const char *x) {

    char *localVar = new char;
    char *localVarPtr = localVar;
    while(*xPtr != '\0') {
        xPtr++;
        localVarPtr++;
    }
}

假设 x 指向某个以 null 结尾的单词。执行完while循环后,localVarPtr是否指向了一个没有分配给localVar的位置?例如,如果我在这个函数中声明了一些其他变量,然后将 localVar 和 localVarPtr 之间的所有字节设置为字符 'c',这可能会覆盖其他变量的值吗?

我的另一个问题是,如果这被认为是不好的做法(即可能覆盖变量或导致未定义的行为),如果 x 指向一个大小为 unlimited? x 的大小可能大于无符号整数,因此我无法在 localVar 的初始化中使用该大小。

【问题讨论】:

  • 我在哪里可以买到无限内存的电脑?圣诞节我没有得到一个:-(
  • 代码应该做什么?

标签: c++ variables pointers strlen


【解决方案1】:

假设 x 指向某个以空字符结尾的单词。执行完while循环后,localVarPtr是否指向了一个还没有分配给localVar的位置?

这完全取决于 x 的长度 - 例如,如果 x 仅包含空终止符,则不包含,localVarPtr 的值指向由 new 分配的区域的开头。

例如,如果我在这个函数中声明了一些其他变量,然后将 localVar 和 localVarPtr 之间的所有字节设置为字符“c”,这可能会覆盖其他变量的值吗?

您没有改变存储在任何地址中的内存,因此不会发生覆盖。如果您的 localVarPtr 指向地址 0x8000 的区域,然后您修改 0x8010,假设 0x0810 是“局部变量”,那么是的,其内容将被更改。这是狂野的西部,任何被取消引用和分配的有效(或有时无效)地址都会改变或发出信号。

我的另一个问题是这是否被认为是不好的做法(即可能覆盖变量或导致未定义的行为),

是的,通常指向或修改未定义的内存是不好的做法。然而,有意设置的指向局部变量的指针是完全可以的。未定义的行为总是不好的做法。

如果 x 指向一个大小不受限制的单词,那么为 localVar 分配足够空间的方法是什么? x 的大小可能大于无符号整数,因此我无法在 localVar 的初始化中使用该大小。

正如 Mat 所指出的,没有这种方法可以拥有“无限”长度的字符串。如果您需要分配空间以匹配 x 字符串的大小,您必须通过调用函数来确定其长度或将其传递给此函数来简单地知道大小。一旦知道大小,就可以使用 new 为其分配。

【讨论】:

    猜你喜欢
    • 2021-02-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多