【问题标题】:Storing pointer value into separate variable将指针值存储到单独的变量中
【发布时间】:2014-12-09 02:20:11
【问题描述】:

我有一个 char*,我想存储它的值,而新变量不是指向原始变量的另一个指针。

char* newVal;

void Foo(char* val)
{
    newVal=val;
    //things happen that change what val represents
}

我希望 newVal 在其他代码更改之前获取 val 并保持它的值。以便稍后在我的代码中,我可以比较这两个值。

这可能吗?有没有更好的办法?

【问题讨论】:

  • 您真的想克隆val 指向的内容吗?不过那是完全不同的事情。始终清楚您正在谈论和思考的确切对象。顺便说一句,发布后出去喝咖啡是不受欢迎的,尤其是在高容量标签上。
  • 我想要它,以便“newVal”不是指向“val”的指针,它只携带相同的数据值。
  • @Whelandrew 请看我的解释...
  • 您的意思是,您要克隆val 指向的对象并将副本地址分配给newVal?在这里学究气很重要,计算机通常不使用模糊逻辑和猜测。
  • 谢谢,拉维。这就是我一直在寻找的。​​span>

标签: c++ pointers char storage


【解决方案1】:
newVal=val;

这将使 newVal 指向与 val 相同的内存位置,即对 val 的任何更改也将反映在 newVal 中。

在您的情况下,您似乎希望 newVal 成为 val 的副本。

newVal = new char[strlen(val)+1];  //You can also use malloc.
strcpy(newVal, val);               //newVal and val are separate objects now.

【讨论】:

  • val 和 newVal 是独立的对象,即使它们应该具有相同的值。请不要让 OP 混淆。
【解决方案2】:

首先,盘点一下你想要什么,然后说出来。
请记住,计划不是领土,地理代码不是房子,指针和它指向的对象可能是完全不同的东西。

现在,已经这样做并且(我猜)实际上想要复制指向的对象,问题是 它是什么?
如果我们不知道它是什么,我们就无法复制一个对象,所以我们假设它是一个以 0 结尾的字符串,也就是 c-string。

在这种情况下,我们可以使用 Posix strdup()-function 创建一个副本:

char* copy = strdup(val);

如果您没有strdup,则实现如下所示:

char* strdup(const char* p) {
    size_t n = strlen(p) + 1;
    char* r = malloc(n);
    if(r) memcpy(r, p, n);
    return r;
}

之后别忘了free。

【讨论】:

    猜你喜欢
    • 2016-06-02
    • 1970-01-01
    • 2021-11-06
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多