【问题标题】:Changing the value of a string with a pointer in C在 C 中使用指针更改字符串的值
【发布时间】:2018-05-06 20:59:04
【问题描述】:

我试图通过将字符串的指针传递给函数,然后在函数中更改该指针的值来更改字符串 t_string 的值。

我收到的输出是原始字符串“Hello”。

任何帮助将不胜感激:) 谢谢!

#include <stdio.h>
#include "string.h"

void editString(char *theString);

int main() {
    char t_string[] = "Hello\n";
    char *s = t_string;
    editString(s);
    printf("The string after: %s", t_string);
    return 0;
}

void editString(char *theString){
    theString = "Good Bye\n";
}

【问题讨论】:

  • 您需要传递指针的地址而不是void editString(char **theString) { *thString = "Good Bye\n" },但请注意,生成的字符串将指向字符串文字,而最初它指向的是数组。
  • 'theString = "再见\n";'更改函数参数,但不更改调用者的参数。 C函数参数按值传递,即。它们被复制到参数中。
  • @IharobAlAsimi:使用你的代码可能会导致核心转储,因为最后几个字节没有正确分配,对吧?
  • @LionLai 不,因为重新分配指针不是问题。

标签: c string function pointers


【解决方案1】:

数组指示符是不可修改的左值。所以你不能这样改变数组。

在此声明中

char *s = t_string;

创建了一个名为s 的新对象,该对象由数组t_string 的第一个字符的地址初始化。

在本次通话中

editString(s);

创建了分配给函数参数的参数值的副本。

你可以想象函数定义及其调用方式如下

editString(s);

//...

void editString(/*char *theString*/){
    char *theString = s; 
    theString = "Good Bye\n";
}

所以即使是参数s 也不会被函数改变。首先是局部变量theString 由存储在参数s 中的值初始化,然后这个局部变量由字符串文字"Good Bye\n" 的第一个字符的地址重新分配。

main中定义的数组t_string和指针s在函数中都没有改变。

如果您想更改数组,您必须单独分配其字符,例如使用标头&lt;string.h&gt; 中声明的标准字符串函数strcpy。数组必须有足够的大小来容纳新的字符串字面量。

例如

#include <stdio.h>
#include "string.h"

void editString(char *theString);

int main( void ) 
{
    char t_string[10] = "Hello\n";
    char *s = t_string;
    editString(s);
    printf("The string after: %s", t_string);
    return 0;
}

void editString(char *theString){
    strcpy( theString, "Good Bye\n" );
}

考虑到根据 C 标准,不带参数的函数 main 应声明为

int main( void )

【讨论】:

    【解决方案2】:

    在 C 中,参数是按值传递的。您正在做的是将局部变量 theString 的值更改为指向字符串文字。局部变量的变化不会反映在调用函数中。

    要更改theString 指向的内容,请使用strcpy。这将遵循theString 指向的内容(即main 中的数组)。但是请注意,该数组不足以容纳新字符串,因此如果您这样做,您将写入数组末尾并调用未定义的行为。所以你需要使数组足够大以容纳任何一个字符串。

    int main() {
        char t_string[20] = "Hello\n";   // enlarge array to hold either string
        char *s = t_string;
        editString(s);
        printf("The string after: %s", t_string);
        return 0;
    }
    
    void editString(char *theString){
        strcpy(theString, "Good Bye\n");   // use strcpy
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-29
      • 2023-04-01
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多