指向指针和strcpy的函数

MoM*_*oe0 2 c pointers function

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

void Get_Text(char *string);
void Get_Text_Double(char **string);
void String_Copy(char *string);

int main(void) {
    char *name = malloc(10 * sizeof(char));
    char *name2 = malloc(10 * sizeof(char));
    char *name3 = malloc(10 * sizeof(char));

    Get_Text(name);
    printf("\n%s\n", name);

    Get_Text_Double(&name2);
    printf("\n%s\n", name2);

    String_Copy(name3);
    printf("\n%s\n", name3);

    return 0;
}

void Get_Text(char *string) {
    string = "test";
}

void Get_Text_Double(char **string) {
    *string = "test2";
}

void String_Copy(char *string) {
    strcpy(string, "test3");
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,为什么Get_Text_DoubleString_Copy函数有效,而Get_Text函数却没有?

另外为什么String_Copy函数只能用一个指针代替双指针Get_Text_Double呢?

Wea*_*ane 7

Get_Text函数不起作用,因为它只更改传递给它的指针的副本.函数退出后,它将丢失.该=运营商不能复制一个字符串,无论如何,指针才值.这样一线

printf("\n%s\n", name);
Run Code Online (Sandbox Code Playgroud)

导致未定义的行为,因为分配的内存name尚未初始化.

在下一个函数中,指针Get_Text_Double位置被传递.它由指向字符串文字的指针替换,覆盖从中获取的指针malloc.所以现在不可能free(name2).

在最后一个函数中String_Copy,库函数strcpy用于将字符串文字复制到为其获取的内存中name3.

最后一个函数是三者中唯一的一个,它实际上将一个字符串复制到提供的内存中.另外两个只将指针复制到一个字符串,在第一个例子中丢失了.

编辑.

在单个的第三种情况下,*传递指针 - name3指向已分配的内存.传递给strcpy它,将字符串文字复制到指向的内存.

但是第二个函数**传递了一个指向指针的指针,因此它不是传递分配的内存的地址,而是传递指针本身的地址.请注意,它被调用

Get_Text_Double(&name2)
Run Code Online (Sandbox Code Playgroud)

它具有&其他2个功能所缺少的地址运算符.

因此,当你写信给*string你时,你正在改变实际指针name2本身的值,而不是它所分配的内存.

因此,name2现在将指向您的字符串文字,"test2"并且没有复制任何文本.现在,您已经更改了指针,并且无法将其新值传递给,free因为您不能free使用字符串文字.你只能free通过使用最初返回的指针值来获取内存malloc,这是你无法做到的,因为它name2已被覆盖.