<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[[实践OK]CentOS下C语言学习之经过函数复制字符串到指针在Clang中的函数失败的原因。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Unix/LinuxC技术]]></category>
<pubDate>Fri, 29 Nov 2019 06:44:04 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	想对指针类型里装的地址改动，在函数参数里需要两个**表明它是一个指向指针的指针（也就是传的是指针q的地址） ，ptr_copy(char ** d,char *s)&#123; *d = s;&#125; ，赋值里注意一下是*d =s（*d就是传指针地址的址，不再是值，也就是不会被在函数完成销毁后，外面值不会变，因为传的是指针q的地址。）,也就是d里存指针地址*d表示，*d=s，s就是一个地址刚好能赋值。<br/>更多说明帮助理解传参部分：<br/>c语言菜鸟指针传递 问题 void func(char **p) &#123;&#125; int main(void) &#123; char *q=null; func(&amp;q); &#125; p被赋值了神马 为什么俩星号?<br/>p被赋值的是char* p的地址！你把char* 理解为一个变量就好理解了，就好比char a；char是变量类型，a是变量。既然是变量它就有地址，所以p也有地址，char **p，可以看成是 char* （*p）所以char** 被传的值是存放地址的变量的地址！ <br/><br/>void func(char **p) &#123;&#125; //函数参数是指向指针的指针<br/>int main(void)<br/>&#123;<br/>char *q=null; //q定义为指针类型<br/>func(&amp;q); //&amp;q,是取q的地址，q是一个指针类型，所以&amp;q就是指针q的地址，即向指针的指针<br/>&#125;<br/><br/>来自：https://zhidao.baidu.com/question/686311732439253092.html<br/><br/><br/>问：运行的以下clang代码，我希望输出ptr3=123与var相同ptr2的结果，但是结果是ptr3=(null)。如何修改我想要的结果代码？<br/><textarea name="code" class="C" rows="15" cols="100">
#include &lt;stdio.h&gt;

void ptr_copy(char* d, char* s)
&#123;
&nbsp;&nbsp;&nbsp;&nbsp;d = s;
&#125;

int main()&#123;
&nbsp;&nbsp;&nbsp;&nbsp;char *ptr = &quot;123&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;char* ptr2;
&nbsp;&nbsp;&nbsp;&nbsp;char* ptr3;

&nbsp;&nbsp;&nbsp;&nbsp;ptr2 = ptr;
&nbsp;&nbsp;&nbsp;&nbsp;ptr_copy(ptr3, ptr);

&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;ptr2=%s&#92;n&quot;, ptr2);
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;ptr3=%s&#92;n&quot;, ptr3);

&nbsp;&nbsp;&nbsp;&nbsp;// output 
&nbsp;&nbsp;&nbsp;&nbsp;// ptr2=123
&nbsp;&nbsp;&nbsp;&nbsp;// ptr3=(null)

&#125; 
</textarea><br/>gcc a.c -o a<br/>./a<br/>ptr2=123<br/>ptr3=1PTI<br/><br/>让我们来看看您的“复制”功能：<br/><br/>void ptr_copy(char* d, char* s)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;d = s;<br/>&#125;<br/>在函数中，变量d是局部变量。一旦函数返回并d超出范围并终止其生命，对它的分配将丢失。<br/><br/>这使您ptr3在main函数中留下未初始化的变量，使用它会导致未定义的行为 -<br/><br/>如果要复制指针，则需要通过将指针传递给指针本身来模拟按引用传递：<br/><br/>void ptr_copy(char** d, char* s)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;*d = s;<br/>&#125;<br/>并称其为<br/><br/>ptr_copy(&amp;ptr3, ptr)<br/><br/>需要的是一个不同的ptr_copy功能，如下所示：<br/><br/>void ptr_copy(char** dst, char* src) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;(*dst) = src;<br/>&#125;<br/><br/>ptr_copy(&amp;ptr3, ptr);<br/>这个想法是您将内容填充ptr到ptr3存储的位置（因此&amp;ptr3，不是ptr3）。<br/><br/>当您将指针传递给函数时，该指针的值将被传递（即给定指针指向的地址）。因此，d内部ptr_copy的指针不同于（与该指针具有相同的值，但它位于内存的另一部分中）不同的指针。这就是为什么分配，更改地址指向的原因，但是对却没有任何作用。<br/><br/>确实考虑一个功能<br/><br/>void value_copy(int d, int s) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;d = s;<br/>&#125;<br/>int i1 = 3;<br/>int i3 = 2;<br/>value_copy(i3, i1);<br/>您不希望i3在调用后等于3 value_copy()，对吗？<br/><br/>正确调用如下：<br/><br/><textarea name="code" class="php" rows="15" cols="100">
#include &lt;stdio.h&gt;

void ptr_copy(char** d, char* s)
&#123;
&nbsp;&nbsp;&nbsp;&nbsp;*d = s;
&#125;

int main()&#123;
&nbsp;&nbsp;&nbsp;&nbsp;char *ptr = &quot;123&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;char* ptr2;
&nbsp;&nbsp;&nbsp;&nbsp;char* ptr3;

&nbsp;&nbsp;&nbsp;&nbsp;ptr2 = ptr;
&nbsp;&nbsp;&nbsp;&nbsp;ptr_copy(&amp;ptr3, ptr);

&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;ptr2=%s&#92;n&quot;, ptr2);
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;ptr3=%s&#92;n&quot;, ptr3);

&nbsp;&nbsp;&nbsp;&nbsp;// output 
&nbsp;&nbsp;&nbsp;&nbsp;// ptr2=123
&nbsp;&nbsp;&nbsp;&nbsp;// ptr3=(null)

&#125; 


</textarea><br/><br/><br/>#make a.c<br/>cc&nbsp;&nbsp;&nbsp;&nbsp; a.c&nbsp;&nbsp; -o a<br/><br/>#./a<br/>ptr2=123<br/>ptr3=123<br/><br/><br/>来自：https://stackoverflow.com/questions/59084119/copy-string-to-pointer-failed-in-function-in-clang<br/><br/><br/><br/>经GDB调试一下，发现其经过char ** d传参数进入函数后，实现了对传入的指针传址的d进行了修改，返回时也是作了修改，所以能正确指向123，GDB在打印时print ptr就是地址和值，如下：<br/>(gdb) l<br/>8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int main()&#123;<br/>9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *ptr = &quot;123&quot;;<br/>10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char* ptr2;<br/>11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char* ptr3;<br/>12<br/>13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr2 = ptr;<br/>14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;ptr=%p&#92;n&quot;, ptr);<br/>15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;ptr2=%p&#92;n&quot;, ptr2);<br/>16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr_copy(&amp;ptr3, ptr);<br/>17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;ptr3=%p&#92;n&quot;, ptr3);<br/>(gdb) p ptr<br/>$1 = 0x400670 &quot;123&quot;<br/>(gdb) n<br/>14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;ptr=%p&#92;n&quot;, ptr);<br/>(gdb) s<br/>ptr=0x400670<br/>15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;ptr2=%p&#92;n&quot;, ptr2);<br/><br/>(gdb) p ptr<br/>$3 = 0x400670 &quot;123&quot;<br/>(gdb) s<br/>ptr2=0x400670<br/>16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr_copy(&amp;ptr3, ptr);<br/>(gdb) s<br/>ptr_copy (d=0x7fffffffe498, s=0x400670 &quot;123&quot;) at a.c:5<br/>5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *d = s;<br/>(gdb) p d<br/>$4 = (char **) 0x7fffffffe498<br/>(gdb) s<br/>6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/><br/>(gdb) s<br/>main () at a.c:17<br/>17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;ptr3=%p&#92;n&quot;, ptr3);<br/>(gdb) p ptr3<br/>$6 = 0x400670 &quot;123&quot;<br/><br/>经过函数的运作，这个ptr,ptr2,ptr3都指向了0x400670，也就是123。
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [实践OK]CentOS下C语言学习之经过函数复制字符串到指针在Clang中的函数失败的原因。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>