【问题标题】:Setting value of string in function does not work在函数中设置字符串的值不起作用
【发布时间】:2015-09-24 03:01:06
【问题描述】:
void func(char *var) 
{
    var = "Hello"; 
}

int main () {
   char var[10];
   func(var);
   printf ("var is %s", var);
}

为什么上面的代码在 C 中不起作用? (printf 什么也不显示)。 将 var = "hello;" 更改为 strcpy(var, "hello"); 可以解决此问题:

void func (char *var) 
{
    strcpy(var, "HELLO");
}

【问题讨论】:

  • 为什么void func(int i) {i = 7;} int main() {int x = 5; f(x); printf("%d\n", x); return 0;} 打印的是 5 而不是 7?
  • 这显然是按值传递的。在我上面的代码中,只需将直接分配 (=) 更改为 strcpy 即可解决问题。函数原型还是一样的,接受一个字符指针:func (char * var)。
  • 非常相似。虽然没有建议或讨论 strcpy,但我正在尝试将字符串文字分配给字符指针(不从数组复制到另一个数组或尝试更改它们的地址)

标签: c


【解决方案1】:

因为var = "Hello" 修改了参数var。参数存储在新变量中 - 这不会修改 main 中另一个变量(也称为 var)的值。

换句话说,它不起作用的原因与它不起作用的原因相同:

void func(int i)
{
    i = 7;
}

int main()
{
    int i = 0;
    func(i);
    printf ("var is %i", var);
}

现在,考虑这两个函数(和一个全局变量):

int five = 5;

void func1(int *p)
{
    p = &five;
}

void func2(int *p)
{
    *p = five;
}

int main()
{
    int i = 0;
    printf("%d\n", i); // prints 0 (duh)
    func1(&i);
    printf("%d\n", i); // still prints 0
    func2(&i);
    printf("%d\n", i); // prints 5
}

你知道区别吗? func1 修改p 本身(通过将其设置为five 的地址)。 pfunc1 中的一个局部变量,因此没有理由更改它会影响 main 中的任何内容。

另一方面,func2 修改 p 指向的东西。而p 指向main 中的局部变量i - 所以这个确实 修改了main 中的i

现在考虑这些函数:

void func3(char *s)
{
    s = "Hello";
}
void func4(char *s)
{
    strcpy(s, "Hello");
}

字符串文字 ("Hello") 在这里是一个红鲱鱼,所以我们主要从等式中删除它:

char hello_string[] = {'H', 'e', 'l', 'l', 'o', '\0'};
char *hello_string_pointer = &hello_string[0];

void func3(char *s)
{
    s = hello_string_pointer;
}
void func4(char *s)
{
    strcpy(s, hello_string_pointer);
}

func3 不可能影响 main 中的任何内容,原因与 func1 不能 - sfunc3 中的局部变量相同,我们只是更改 s .

另一方面,func4 调用 strcpy。你知道strcpy 做什么吗?它相当于:

void func4(char *s)
{
    for(int k = 0; k < 6; k++)
        *(s + k) = *(hello_string_pointer + k);
}

那里有一些指针算法,但重点是,它修改了 *s 指向, and the 5 things after it - which are the first 6 elements of the array inmain`的东西。

【讨论】:

  • 直到大量的代码 sn-ps 可以使答案看起来真的长。
  • 谢谢!之前对这个问题的所有答案都去了哪里?
  • @codemaster 我看到两个已删除的答案,均为负分,且均已被其所有者删除。 (拥有 10k 代表或更多的用户可以看到已删除的答案,如果您想知道我是如何看到的)
  • 是的,这是一个更详细和图解的答案。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多