【问题标题】:simply accessing char array in a function by char pointer只需通过 char 指针访问函数中的 char 数组
【发布时间】:2014-08-16 03:11:15
【问题描述】:

在这个程序中,我通过函数指针访问全局 char 数组,使用 char 指针中的地址逐个地址更改字符串值 对全局 char 数组有影响,但是当将字符串更改为整个字符串时,它对全局数组没有任何影响

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

void function(char *string);

char str[20] = "Hello"; // global char array

int main()
{
    function(str);
    return 0;
}

void function(char *string)
{   
    int i;

    printf("%s\n",string);
    printf("%s\n", str);

    for(i = 0;i < strlen(string);i++)
        string[i] = 'a';    

    printf("%s\n",string);
    printf("%s\n", str);

    string = "jhony";

    printf("%s\n",string);
    printf("%s\n",str);        // here is the doubt 
}

输出

Hello
Hello
aaaaa
aaaaa
jhony
aaaaa //how this supposed to print aaaaa even after we changed string into jhony 

【问题讨论】:

  • 您的问题是可以用来说明指针的经典示例。事实上,这是预期的行为,您的期望是错误的。为了覆盖数据,您必须使用 strcpy 之类的东西。
  • 为避免此类问题,请使用例如std::string 处理字符串。
  • @Alf,c++ 可能包含在此处的错误中。所有迹象都表明这只是C。

标签: c string pointers printf


【解决方案1】:
string = "jhony";

不会将"jhony" 复制到string 指向的内存中。相反,它将"jhony" 的地址分配给string。

所以在那之后,string 指向"jhony" 而str 保持不变。


正如@BrianCain 评论的那样,将"jhonny" 复制到string 寻址的内存中,您可以使用

strcpy(string, "jhonny");

【讨论】:

  • 为什么会这样?
  • 更一般地说,C++ 中的原始数组仅支持在作为结构成员的上下文中进行赋值,其中结构的赋值执行嵌套数组赋值。这不是很合乎逻辑。就是这样。
  • @siva 这正是 C/C++ 定义它的方式。当然,如果你使用std::string而不是原始的char*,行为会有所不同。
【解决方案2】:

string 和 str 都是指向同一事物的不同指针。使用数组 表示法与取消引用相同,因此您实际上是在操纵基础数据,并且因为它们指向同一事物,所以在两个地方都注意到了更改。

当您将指针设置为等于字面量时,没有任何取消引用或数组表示法。这改变了指针指向的内容,但没有触及底层数据。所以这个变化没有被另一个指针注意到。

在指针的值是地址的意义上,将指针设置为等于某物会更改其值。该地址是对指针指向的任何内容的引用,但现在指针指向新地址。在你的情况下,字符串文字。

【讨论】:

    【解决方案3】:

    这是因为字符串是一个局部变量。当您设置 string = jhony 时,您不会更改 str。您只是在更改字符串所指向的内容。在此之后定义了两个字符串常量,“aaaaa”和“jhony”,aaaaa 字符串不会被覆盖。 Str 也仍然是“aaaaa”,因为它没有被 johnny 分配给字符串所覆盖。

    【讨论】:

      【解决方案4】:
      string = "jhony";
      

      这条语句改变了字符串的值,这意味着变量字符串不再指向全局数组,它现在指向存储在函数堆栈中的新常量字符串“johny”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-26
        • 1970-01-01
        • 2018-04-05
        • 2012-03-19
        • 1970-01-01
        • 1970-01-01
        • 2015-02-04
        • 2018-08-16
        相关资源
        最近更新 更多