gpt4 book ai didi

c - 具有指向指针和 strcpy 的指针的函数

转载 作者:行者123 更新时间:2023-12-04 11:14:25 28 4
gpt4 key购买 nike

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

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

另外,为什么 String_Copy 函数只能使用单个指针而不是像 Get_Text_Double 这样的双指针?

最佳答案

Get_Text 函数不起作用,因为它只更改传递给它的指针的副本。函数退出后,它就丢失了。 = 运算符无论如何都不能复制字符串,只能复制指针的值。所以这条线

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

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

在下一个函数 Get_Text_Double 中传递了指针的位置。这被指向字符串文字的指针所取代,覆盖了从 malloc 获得的指针。所以现在不可能free(name2)

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

最后一个函数是三个函数中唯一的一个,它实际上将字符串复制到提供的内存中。其他两个只复制指向字符串的指针,在第一个示例中丢失了。

编辑。

在第三种情况下,只有一个*,传递了一个指针——name3,它指向分配的内存。它被传递给 strcpy,后者将字符串文字复制到所指向的内存中。

但是带有 ** 的第二个函数被传递了一个指向一个指针的指针,所以它不是被传递的分配内存的地址,而是被传递的地址指针本身。请注意,它是用

调用的
Get_Text_Double(&name2)

它有一个 & address-of 运算符,而其他 2 个函数没有。

因此,当您写入 *string 时,您正在更改实际指针 name2 本身的值,而不是分配给它的内存。

所以 name2 现在将指向您的字符串文字 "test2" 并且没有复制任何文本。现在,您已经更改了指针,并且无法将其新值传递给 free,因为您无法 free 字符串文字。您只能使用 malloc 最初返回的指针值来释放 内存,您不能这样做,因为 name2 已被覆盖。

关于c - 具有指向指针和 strcpy 的指针的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40326840/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com