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
已被覆盖.
归档时间: |
|
查看次数: |
233 次 |
最近记录: |