函数中字符串的设置值不起作用

时间:2015-09-24 03:01:07

标签: c

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");
}

1 个答案:

答案 0 :(得分:1)

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

换句话说,由于这不起作用,它不起作用:

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指向i中的本地变量main - 所以这个 修改了i中的main

现在考虑以下这些功能:

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 in main`的东西。