繁体   English   中英

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

[英]Setting value of string in function does not work

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

因为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 in main` 中, and the 5 things after it - which are the first 6 elements of the array in

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM