【问题标题】:Changing a string pointer in C [duplicate]在C中更改字符串指针[重复]
【发布时间】:2023-04-01 09:20:01
【问题描述】:

显然,我是一个大俱乐部的成员,只是不正确理解 C 样式指针。这是我的程序:

void changethestring (const char * thestring)
{
    thestring = "string two";
}

int _tmain(int argc, _TCHAR* argv[])
{
    const char * teststring = "string one";
    changethestring(teststring);
    printf("The string is: %s.\n", teststring);
    return 0;
}

我的意图是 changethestring() 应该使指针指向“字符串二”。我的逻辑是我给函数一个指针。该函数应该能够将指针更改为指向内存中的不同区域。而且这种变化应该在函数之外持续存在。

但事实并非如此。在 printf() 语句中,字符串仍然是“字符串一”。

谁能解释这是为什么,幕后发生了什么,以及如何编写函数 changethestring() 来更改指针指向的字符串?

【问题讨论】:

  • thestring 指向字符串。您需要更改指针本身。传递const char ** 并将行更改为*thestring = "string two" 然后使用changestring(&teststring) 调用
  • 这里,teststring(具有地址 0)包含一些内存地址,例如 200,现在您将该地址提供给另一个变量 thestring(具有地址 4)(这里,@ 987654329@ 得到了一份由teststring 持有的副本)。现在,您在地址 4 所做的更改仍保留在地址 4。尽管您尝试在 main 中访问的内容实际上是在地址 0。我希望它有意义。
  • 代码说明字符串是常量(即不可更改),因此分配应该在编译时失败。并且在执行时没有进行赋值,因为指针被定义为常量,所以不能更改。
  • 您唯一更改本地版本的指针 thestring。您需要更改 _tmain() 中的实际指针,以便调用 changethestring(teststring);应该是 changethestring(&teststring);注意新的'&',所以它传递变量的地址而不是“字符串一”文字的地址。然后这一行: thestring = "string two";应该是 *thestring = "字符串二";

标签: c pointers


【解决方案1】:

你应该给一个指针而不是指针。原因是在 C 中,所有参数都是按值发送的。所以为了改变一个指针变量的值,你需要发送一个指向这个变量的指针,因此,指针指向一个指针。

更新:您可以在changethestring 函数之外定义字符串文字,但这不是必需的,因为字符串文字在程序的整个生命周期中都存储在全局字符串表中。所以这两个:

const char* STRING_TWO_LITERAL = "string two";

void changethestring (const char ** thestring)
{
    *thestring = STRING_TWO_LITERAL;
}

int _tmain(int argc, _TCHAR* argv[])
{
    const char * teststring = "string one";
    changethestring(&teststring);
    printf("The string is: %s.\n", teststring);
    return 0;
}

还有这个:

void changethestring (const char ** thestring)
{
    *thestring = "string two";
}

int _tmain(int argc, _TCHAR* argv[])
{
    const char * teststring = "string one";
    changethestring(&teststring);
    printf("The string is: %s.\n", teststring);
    return 0;
}

应该可以。

【讨论】:

  • 谢谢!我应该能够自己弄清楚这一点。有时很难只见树木不见森林。
  • 你有这方面的参考吗?
  • 是的,没错,检查过。
  • -1 对于字符串文字的混淆。
  • 6.4.5 字符串字面量5 然后用序列来初始化一个静态存储时长数组
【解决方案2】:

通过按值传递指针,它会在您退出函数时恢复到初始值。
您应该按照 Ashalynd 的建议通过引用传递它,或者您也可以为此指针返回一个新值:

const char * changethestring (const char * thestring)
{
     thestring = "string two";
     return thestring;
}

int main(void)
{
    teststring = changethestring(teststring);
}

【讨论】:

  • 您希望如何更改const char *
  • 原字符串不变,我返回一个新的地址。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
相关资源
最近更新 更多