【问题标题】:Why isn't `src` changing when I change it from the function?当我从函数中更改它时,为什么 `src` 没有改变?
【发布时间】:2015-06-17 00:16:37
【问题描述】:

我的程序:

#include<stdio.h>
#include<conio.h>

char* str(char*src);\\declared as function global
main()
{
    char src[40]="hello";
    clrscr();
    puts(src);
    str(src);\\ function called
    puts(src);\\does not put changed string?
    getch();
    return 0;
}

char* str( char *src)
{
    src="readers";\\changing my source string<--is it changes???
    return src;\\returning source sting
}

输出:

hello
hello

为什么src 没有变成"readers"

【问题讨论】:

  • return src; 对您提供的代码没有影响。请一次一个问题!仅供参考,代码 sn-p 中没有任何函数指针
  • 如果函数参数的名称与main 中的数组名称不同,这将不会造成混淆。

标签: c arrays string pointers pass-by-value


【解决方案1】:

在您的代码中,src="readers"; 是错误的。你必须尝试喜欢

strcpy(src, "readers");

原因是,C 在传递函数参数时使用了按值传递。所以,这里的src 是按值传递的,所以你不能从函数内部更改src。您可以从函数中更改*src。所以,要改变src指向的内容,你必须使用strcpy()

另外,正如 @coolguy 先生所说,您没有使用str() 的返回值,因此return 语句在这里没有任何影响。

【讨论】:

    【解决方案2】:

    让我们看看代码,好吗?

    str(src);
    

    函数以src 作为参数调用。数组src的第一个元素的地址被传递给函数str

    char* str( char *src)
    

    在这个函数中,src是一个指针,指向mainsrc(数组)的第一个元素的地址。

    src="readers";
    

    您更改src 指向的位置并使其指向字符串文字"readers"。这不会影响main 中的数组src

    return src;
    

    返回指针src。在你显示的代码sn -p中,它没有任何作用。

    你真正想要的是

    strcpy(src,"readers");
    

    而不是

    src="readers";
    

    前者将字符串"readers" 复制到src 及其后续字节,这会更改main 中数组src 的内容。
    后者使指针src 指向一个新的字符串文字"readers"

    【讨论】:

      【解决方案3】:

      在 main 你声明了数组

      char src[40]="hello";
      

      当你将数组传递给函数时

      str(src);
      

      它被转换为一个临时对象,它是指向数组第一个元素的指针。函数的参数是函数的局部变量,退出函数后销毁。

      你可以想象下面的函数调用和它的定义

      str(src);
      
      char* str( void )
      {
          char * s = &src[0]
          s = "readers";
      
          return s;
      }
      

      首先这个局部变量(我将它重命名为 s 以区别于原始数组)分配了数组第一个元素的地址,然后它重新分配了字符串字面量的第一个元素的地址。并且从函数返回字符串文字的第一个元素的地址。退出函数后,局部变量(即函数参数)被销毁。

      这些操作不会影响原始数组本身。您一直在处理函数中的局部变量 s。

      如果您希望将字符串文字复制到原始数组中,您必须使用标头&lt;string.h&gt; 中声明的标准C 函数strcpy。例如

      #include <string.h>
      
      //...
      
      char* str( char *s )
      {
          strcpy( s, "readers" );
      
          return s;
      }
      

      在这种情况下,原始数组将被更改,因为在函数 strcpy 中使用了指向其第一个元素 s 的指针,因此字符串文字被复制到数组中指针指向的区域中.

      考虑到数组没有赋值运算符。您可以通过以下方式初始化数组

      char src[40] = "hello";
      

      但你不能在数组定义后写下面的赋值语句

      src = "hello";
      

      您必须逐个元素地复制数组,例如通过标准函数 strcpy 包含字符串的字符数组

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-23
        • 2022-08-03
        • 2023-01-14
        • 1970-01-01
        • 2019-01-06
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多