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_Double和String_Copy函数有效,而Get_Text函数却没有?
另外为什么String_Copy函数只能用一个指针代替双指针Get_Text_Double呢?
该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已被覆盖.