标题:[实践OK]CentOS下C语言学习之经过函数复制字符串到指针在Clang中的函数失败的原因。 出处:向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除 时间:Fri, 29 Nov 2019 14:44:04 +0000 作者:jackxiang 地址:http://jackxiang.com/post/10357/ 内容: 想对指针类型里装的地址改动,在函数参数里需要两个**表明它是一个指向指针的指针(也就是传的是指针q的地址) ,ptr_copy(char ** d,char *s){ *d = s;} ,赋值里注意一下是*d =s(*d就是传指针地址的址,不再是值,也就是不会被在函数完成销毁后,外面值不会变,因为传的是指针q的地址。),也就是d里存指针地址*d表示,*d=s,s就是一个地址刚好能赋值。 更多说明帮助理解传参部分: c语言菜鸟指针传递 问题 void func(char **p) {} int main(void) { char *q=null; func(&q); } p被赋值了神马 为什么俩星号? p被赋值的是char* p的地址!你把char* 理解为一个变量就好理解了,就好比char a;char是变量类型,a是变量。既然是变量它就有地址,所以p也有地址,char **p,可以看成是 char* (*p)所以char** 被传的值是存放地址的变量的地址! void func(char **p) {} //函数参数是指向指针的指针 int main(void) { char *q=null; //q定义为指针类型 func(&q); //&q,是取q的地址,q是一个指针类型,所以&q就是指针q的地址,即向指针的指针 } 来自:https://zhidao.baidu.com/question/686311732439253092.html 问:运行的以下clang代码,我希望输出ptr3=123与var相同ptr2的结果,但是结果是ptr3=(null)。如何修改我想要的结果代码? #include void ptr_copy(char* d, char* s) { d = s; } int main(){ char *ptr = "123"; char* ptr2; char* ptr3; ptr2 = ptr; ptr_copy(ptr3, ptr); printf("ptr2=%s\n", ptr2); printf("ptr3=%s\n", ptr3); // output // ptr2=123 // ptr3=(null) } gcc a.c -o a ./a ptr2=123 ptr3=1PTI 让我们来看看您的“复制”功能: void ptr_copy(char* d, char* s) { d = s; } 在函数中,变量d是局部变量。一旦函数返回并d超出范围并终止其生命,对它的分配将丢失。 这使您ptr3在main函数中留下未初始化的变量,使用它会导致未定义的行为 - 如果要复制指针,则需要通过将指针传递给指针本身来模拟按引用传递: void ptr_copy(char** d, char* s) { *d = s; } 并称其为 ptr_copy(&ptr3, ptr) 需要的是一个不同的ptr_copy功能,如下所示: void ptr_copy(char** dst, char* src) { (*dst) = src; } ptr_copy(&ptr3, ptr); 这个想法是您将内容填充ptr到ptr3存储的位置(因此&ptr3,不是ptr3)。 当您将指针传递给函数时,该指针的值将被传递(即给定指针指向的地址)。因此,d内部ptr_copy的指针不同于(与该指针具有相同的值,但它位于内存的另一部分中)不同的指针。这就是为什么分配,更改地址指向的原因,但是对却没有任何作用。 确实考虑一个功能 void value_copy(int d, int s) { d = s; } int i1 = 3; int i3 = 2; value_copy(i3, i1); 您不希望i3在调用后等于3 value_copy(),对吗? 正确调用如下: #include void ptr_copy(char** d, char* s) { *d = s; } int main(){ char *ptr = "123"; char* ptr2; char* ptr3; ptr2 = ptr; ptr_copy(&ptr3, ptr); printf("ptr2=%s\n", ptr2); printf("ptr3=%s\n", ptr3); // output // ptr2=123 // ptr3=(null) } #make a.c cc a.c -o a #./a ptr2=123 ptr3=123 来自:https://stackoverflow.com/questions/59084119/copy-string-to-pointer-failed-in-function-in-clang 经GDB调试一下,发现其经过char ** d传参数进入函数后,实现了对传入的指针传址的d进行了修改,返回时也是作了修改,所以能正确指向123,GDB在打印时print ptr就是地址和值,如下: (gdb) l 8 int main(){ 9 char *ptr = "123"; 10 char* ptr2; 11 char* ptr3; 12 13 ptr2 = ptr; 14 printf("ptr=%p\n", ptr); 15 printf("ptr2=%p\n", ptr2); 16 ptr_copy(&ptr3, ptr); 17 printf("ptr3=%p\n", ptr3); (gdb) p ptr $1 = 0x400670 "123" (gdb) n 14 printf("ptr=%p\n", ptr); (gdb) s ptr=0x400670 15 printf("ptr2=%p\n", ptr2); (gdb) p ptr $3 = 0x400670 "123" (gdb) s ptr2=0x400670 16 ptr_copy(&ptr3, ptr); (gdb) s ptr_copy (d=0x7fffffffe498, s=0x400670 "123") at a.c:5 5 *d = s; (gdb) p d $4 = (char **) 0x7fffffffe498 (gdb) s 6 } (gdb) s main () at a.c:17 17 printf("ptr3=%p\n", ptr3); (gdb) p ptr3 $6 = 0x400670 "123" 经过函数的运作,这个ptr,ptr2,ptr3都指向了0x400670,也就是123。 Generated by Jackxiang's Bo-blog 2.1.1 Release