C ++递增char时会发生什么*

时间:2015-12-27 06:40:07

标签: c++ variables pointers strlen

说我有以下代码:

void incrementPointer( const char *x) {

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

让我们说x指向一些以空字符结尾的单词。执行while循环后,localVarPtr是否指向尚未为localVar分配的位置?例如,如果我在此函数中声明了一些其他变量,然后将localVar和localVarPtr之间的所有字节设置为字符“c”,那么这是否会覆盖另一个变量的值?

我的另一个问题是,如果这被认为是不好的做法(即可能覆盖变量或导致未定义的行为),如果x指向一个大小为<的单词,那么为localVar分配足够空间的方法是什么?强>无限? x的大小可能大于无符号整数,因此我无法在localVar的初始化中使用该大小。

1 个答案:

答案 0 :(得分:0)

  

让我们说x指向一些以空字符结尾的单词。执行while循环后,localVarPtr是否指向尚未为localVar分配的位置?

这完全取决于x的长度 - 如果例如x只包含null-terminator则为no,则localVarPtr的值指向new分配的区域的开头。

  

例如,如果我在此函数中声明了一些其他变量,然后将localVar和localVarPtr之间的所有字节设置为字符&#39; c,这是否会覆盖另一个变量的值?

您不会改变存储在任何地址中的内存,因此不会发生覆盖。如果localVarPtr指向地址为0x8000的区域,然后修改0x8010,假设0x0810是&#34;局部变量&#34;然后是的,它的内容会被改变。这是狂野的西部,任何有效(或有时无效)的地址被解除引用并分配给它将改变或发出信号。

  

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

是的,通常指向或修改未定义的内存是不好的做法。然而,一个指向局部变量的指针,无论如何有意设置,都是完美的。未定义的行为总是不好的做法。

  

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

如Mat所表示的那样,没有这样的方式可以拥有&#34;无限制&#34;长度字符串。如果需要分配空间以匹配x的字符串大小,则必须通过调用函数来确定其长度或将其传递给此函数来简单地知道大小。一旦知道了大小,就可以使用new来为它分配。