{"id":5298,"date":"2021-06-06T03:24:02","date_gmt":"2021-06-05T19:24:02","guid":{"rendered":"https:\/\/damogame.cn\/wordpress\/?p=5298"},"modified":"2021-06-06T03:24:02","modified_gmt":"2021-06-05T19:24:02","slug":"c%e8%af%ad%e8%a8%800%e9%95%bf%e5%ba%a6%e6%95%b0%e7%bb%84%e5%8f%af%e5%8f%98%e6%95%b0%e7%bb%84-%e6%9f%94%e6%80%a7%e6%95%b0%e7%bb%84%e8%af%a6%e8%a7%a3","status":"publish","type":"post","link":"https:\/\/i007.cc\/wordpress\/archives\/5298","title":{"rendered":"C\u8bed\u8a000\u957f\u5ea6\u6570\u7ec4(\u53ef\u53d8\u6570\u7ec4\/\u67d4\u6027\u6570\u7ec4)\u8be6\u89e3"},"content":{"rendered":"<p><a href=\"https:\/\/blog.csdn.net\/gatieme\/article\/details\/64131322\">\u539f\u6587\u5730\u5740<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>CHENG Jian 2017-03-20 19:37:26 31665 \u6536\u85cf 132<br \/>\n\u5206\u7c7b\u4e13\u680f\uff1a \u2508\u2508\u3010C \/ C++\u53d1\u73b0\u3011 \u6587\u7ae0\u6807\u7b7e\uff1a c\u8bed\u8a00 \u53d8\u957f\u6570\u7ec4 0\u957f\u5ea6\u6570\u7ec4 C\u6269\u5c55 GNU<br \/>\n\u7248\u6743<br \/>\nCSDN GitHub<br \/>\nC\u8bed\u8a000\u957f\u5ea6\u6570\u7ec4(\u53ef\u53d8\u6570\u7ec4\/\u67d4\u6027\u6570\u7ec4)\u8be6\u89e3 AderXCoding\/language\/c\/zero_length_array<\/p>\n<p>\u672c\u4f5c\u54c1\u91c7\u7528\u77e5\u8bc6\u5171\u4eab\u7f72\u540d-\u975e\u5546\u4e1a\u6027\u4f7f\u7528-\u76f8\u540c\u65b9\u5f0f\u5171\u4eab 4.0 \u56fd\u9645\u8bb8\u53ef\u534f\u8bae\u8fdb\u884c\u8bb8\u53ef, \u8f6c\u8f7d\u8bf7\u6ce8\u660e\u51fa\u5904, \u8c22\u8c22\u5408\u4f5c<\/p>\n<p>1 \u96f6\u957f\u5ea6\u6570\u7ec4\u6982\u5ff5<br \/>\n\u4f17\u6240\u5468\u77e5, GNU\/GCC \u5728\u6807\u51c6\u7684 C\/C++ \u57fa\u7840\u4e0a\u505a\u4e86\u6709\u5b9e\u7528\u6027\u7684\u6269\u5c55, \u96f6\u957f\u5ea6\u6570\u7ec4\uff08Arrays of Length Zero\uff09 \u5c31\u662f\u5176\u4e2d\u4e00\u4e2a\u77e5\u540d\u7684\u6269\u5c55.<\/p>\n<p>\u591a\u6570\u60c5\u51b5\u4e0b, \u5176\u5e94\u7528\u5728\u53d8\u957f\u6570\u7ec4\u4e2d, \u5176\u5b9a\u4e49\u5982\u4e0b<\/p>\n<p>struct Packet<br \/>\n{<br \/>\nint state;<br \/>\nint len;<br \/>\nchar cData[0]; \/\/\u8fd9\u91cc\u76840\u957f\u7ed3\u6784\u4f53\u5c31\u4e3a\u53d8\u957f\u7ed3\u6784\u4f53\u63d0\u4f9b\u4e86\u975e\u5e38\u597d\u7684\u652f\u6301<br \/>\n};<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n\u9996\u5148\u5bf9 0\u957f\u5ea6\u6570\u7ec4, \u4e5f\u53eb\u67d4\u6027\u6570\u7ec4 \u505a\u4e00\u4e2a\u89e3\u91ca \uff1a<\/p>\n<p>\u7528\u9014 : \u957f\u5ea6\u4e3a0\u7684\u6570\u7ec4\u7684\u4e3b\u8981\u7528\u9014\u662f\u4e3a\u4e86\u6ee1\u8db3\u9700\u8981\u53d8\u957f\u5ea6\u7684\u7ed3\u6784\u4f53<\/p>\n<p>\u7528\u6cd5 : \u5728\u4e00\u4e2a\u7ed3\u6784\u4f53\u7684\u6700\u540e, \u7533\u660e\u4e00\u4e2a\u957f\u5ea6\u4e3a0\u7684\u6570\u7ec4, \u5c31\u53ef\u4ee5\u4f7f\u5f97\u8fd9\u4e2a\u7ed3\u6784\u4f53\u662f\u53ef\u53d8\u957f\u7684. \u5bf9\u4e8e\u7f16\u8bd1\u5668\u6765\u8bf4, \u6b64\u65f6\u957f\u5ea6\u4e3a0\u7684\u6570\u7ec4\u5e76\u4e0d\u5360\u7528\u7a7a\u95f4, \u56e0\u4e3a\u6570\u7ec4\u540d\u672c\u8eab\u4e0d\u5360\u7a7a\u95f4, \u5b83\u53ea\u662f\u4e00\u4e2a\u504f\u79fb\u91cf, \u6570\u7ec4\u540d\u8fd9\u4e2a\u7b26\u53f7\u672c\u8eab\u4ee3\u8868\u4e86\u4e00\u4e2a\u4e0d\u53ef\u4fee\u6539\u7684\u5730\u5740\u5e38\u91cf<\/p>\n<p>(\u6ce8\u610f : \u6570\u7ec4\u540d\u6c38\u8fdc\u90fd\u4e0d\u4f1a\u662f\u6307\u9488!), \u4f46\u5bf9\u4e8e\u8fd9\u4e2a\u6570\u7ec4\u7684\u5927\u5c0f, \u6211\u4eec\u53ef\u4ee5\u8fdb\u884c\u52a8\u6001\u5206\u914d<\/p>\n<p>\u6ce8\u610f \uff1a\u5982\u679c\u7ed3\u6784\u4f53\u662f\u901a\u8fc7calloc\u3001malloc\u6216 \u8005new\u7b49\u52a8\u6001\u5206\u914d\u65b9\u5f0f\u751f\u6210\uff0c\u5728\u4e0d\u9700\u8981\u65f6\u8981\u91ca\u653e\u76f8\u5e94\u7684\u7a7a\u95f4\u3002<\/p>\n<p>\u4f18\u70b9 \uff1a\u6bd4\u8d77\u5728\u7ed3\u6784\u4f53\u4e2d\u58f0\u660e\u4e00\u4e2a\u6307\u9488\u53d8\u91cf\u3001\u518d\u8fdb\u884c\u52a8\u6001\u5206 \u914d\u7684\u529e\u6cd5\uff0c\u8fd9\u79cd\u65b9\u6cd5\u6548\u7387\u8981\u9ad8\u3002\u56e0\u4e3a\u5728\u8bbf\u95ee\u6570\u7ec4\u5185\u5bb9\u65f6\uff0c\u4e0d\u9700\u8981\u95f4\u63a5\u8bbf\u95ee\uff0c\u907f\u514d\u4e86\u4e24\u6b21\u8bbf\u5b58\u3002<\/p>\n<p>\u7f3a\u70b9 \uff1a\u5728\u7ed3\u6784\u4f53\u4e2d\uff0c\u6570\u7ec4\u4e3a0\u7684\u6570\u7ec4\u5fc5\u987b\u5728\u6700\u540e\u58f0\u660e\uff0c\u4f7f \u7528\u4e0a\u6709\u4e00\u5b9a\u9650\u5236\u3002<\/p>\n<p>\u5bf9\u4e8e\u7f16\u8bd1\u5668\u800c\u8a00, \u6570\u7ec4\u540d\u4ec5\u4ec5\u662f\u4e00\u4e2a\u7b26\u53f7, \u5b83\u4e0d\u4f1a\u5360\u7528\u4efb\u4f55\u7a7a\u95f4, \u5b83\u5728\u7ed3\u6784\u4f53\u4e2d, \u53ea\u662f\u4ee3\u8868\u4e86\u4e00\u4e2a\u504f\u79fb\u91cf, \u4ee3\u8868\u4e00\u4e2a\u4e0d\u53ef\u4fee\u6539\u7684\u5730\u5740\u5e38\u91cf!<\/p>\n<p>2 0\u957f\u5ea6\u6570\u7ec4\u7684\u7528\u9014<br \/>\n\u6211\u4eec\u8bbe\u60f3\u8fd9\u6837\u4e00\u4e2a\u573a\u666f, \u6211\u4eec\u5728\u7f51\u7edc\u901a\u4fe1\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u7684\u6570\u636e\u7f13\u51b2\u533a, \u7f13\u51b2\u533a\u5305\u62ec\u4e00\u4e2alen\u5b57\u6bb5\u548cdata\u5b57\u6bb5, \u5206\u522b\u6807\u8bc6\u6570\u636e\u7684\u957f\u5ea6\u548c\u4f20\u8f93\u7684\u6570\u636e, \u6211\u4eec\u5e38\u89c1\u7684\u6709\u51e0\u79cd\u8bbe\u8ba1\u601d\u8def<\/p>\n<p>\u5b9a\u957f\u6570\u636e\u7f13\u51b2\u533a, \u8bbe\u7f6e\u4e00\u4e2a\u8db3\u591f\u5927\u5c0f MAX_LENGTH \u7684\u6570\u636e\u7f13\u51b2\u533a<\/p>\n<p>\u8bbe\u7f6e\u4e00\u4e2a\u6307\u5411\u5b9e\u9645\u6570\u636e\u7684\u6307\u9488, \u6bcf\u6b21\u4f7f\u7528\u65f6, \u6309\u7167\u6570\u636e\u7684\u957f\u5ea6\u52a8\u6001\u7684\u5f00\u8f9f\u6570\u636e\u7f13\u51b2\u533a\u7684\u7a7a\u95f4.<\/p>\n<p>\u6211\u4eec\u4ece\u5b9e\u9645\u573a\u666f\u4e2d\u5e94\u7528\u7684\u8bbe\u8ba1\u6765\u8003\u8651\u4ed6\u4eec\u7684\u4f18\u52a3. \u4e3b\u8981\u8003\u8651\u7684\u6709, \u7f13\u51b2\u533a\u7a7a\u95f4\u7684\u5f00\u8f9f, \u91ca\u653e\u548c\u8bbf\u95ee.<\/p>\n<p>2.1 \u5b9a\u957f\u5305(\u5f00\u8f9f\u7a7a\u95f4, \u91ca\u653e, \u8bbf\u95ee)<br \/>\n\u6bd4\u5982\u6211\u8981\u53d1\u9001 1024 \u5b57\u8282\u7684\u6570\u636e, \u5982\u679c\u7528\u5b9a\u957f\u5305, \u5047\u8bbe\u5b9a\u957f\u5305\u7684\u957f\u5ea6 MAX_LENGTH \u4e3a 2048, \u5c31\u4f1a\u6d6a\u8d39 1024 \u4e2a\u5b57\u8282\u7684\u7a7a\u95f4, \u4e5f\u4f1a\u9020\u6210\u4e0d\u5fc5\u8981\u7684\u6d41\u91cf\u6d6a\u8d39.<\/p>\n<p>\u6570\u636e\u7ed3\u6784\u5b9a\u4e49<br \/>\n\/\/ \u5b9a\u957f\u7f13\u51b2\u533a<br \/>\nstruct max_buffer<br \/>\n{<br \/>\nint len;<br \/>\nchar data[MAX_LENGTH];<br \/>\n};<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n\u6570\u636e\u7ed3\u6784\u5927\u5c0f<br \/>\n\u8003\u8651\u5bf9\u9f50, \u90a3\u4e48\u6570\u636e\u7ed3\u6784\u7684\u5927\u5c0f &gt;= sizeof(int) + sizeof(char) * MAX_LENGTH<\/p>\n<p>\u7531\u4e8e\u8003\u8651\u5230\u6570\u636e\u7684\u6ea2\u51fa, \u53d8\u957f\u6570\u636e\u5305\u4e2d\u7684 data \u6570\u7ec4\u957f\u5ea6\u4e00\u822c\u4f1a\u8bbe\u7f6e\u5f97\u8db3\u591f\u957f\u8db3\u4ee5\u5bb9\u7eb3\u6700\u5927\u7684\u6570\u636e, \u56e0\u6b64 max_buffer \u4e2d\u7684 data \u6570\u7ec4\u5f88\u591a\u60c5\u51b5\u4e0b\u90fd\u6ca1\u6709\u586b\u6ee1\u6570\u636e, \u56e0\u6b64\u9020\u6210\u4e86\u6d6a\u8d39<\/p>\n<p>\u6570\u636e\u5305\u7684\u6784\u9020<br \/>\n\u5047\u5982\u6211\u4eec\u8981\u53d1\u9001 CURR_LENGTH = 1024 \u4e2a\u5b57\u8282, \u6211\u4eec\u5982\u4f55\u6784\u9020\u8fd9\u4e2a\u6570\u636e\u5305\u5462:<\/p>\n<p>\u4e00\u822c\u6765\u8bf4, \u6211\u4eec\u4f1a\u8fd4\u56de\u4e00\u4e2a\u6307\u5411\u7f13\u51b2\u533a\u6570\u636e\u7ed3\u6784 max_buffer \u7684\u6307\u9488.<\/p>\n<p>\/\/\/ \u5f00\u8f9f<br \/>\nif ((mbuffer = (struct max_buffer *)malloc(sizeof(struct max_buffer))) != NULL)<br \/>\n{<br \/>\nmbuffer-&gt;len = CURR_LENGTH;<br \/>\nmemcpy(mbuffer-&gt;data, &#8220;Hello World&#8221;, CURR_LENGTH);<\/p>\n<p>printf(&#8220;%d, %s\\n&#8221;, mbuffer-&gt;len, mbuffer-&gt;data);<br \/>\n}<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<br \/>\n\u8bbf\u95ee<br \/>\n\u8fd9\u6bb5\u5185\u5b58\u8981\u5206\u4e24\u90e8\u5206\u4f7f\u7528<\/p>\n<p>\u524d\u90e8\u5206 4 \u4e2a\u5b57\u8282 p-&gt;len, \u4f5c\u4e3a\u5305\u5934(\u5c31\u662f\u591a\u51fa\u6765\u7684\u90a3\u90e8\u5206)\uff0c\u8fd9\u4e2a\u5305\u5934\u662f\u7528\u6765\u63cf\u8ff0\u7d27\u63a5\u7740\u5305\u5934\u540e\u9762\u7684\u6570\u636e\u90e8\u5206\u7684\u957f\u5ea6\uff0c\u8fd9\u91cc\u662f 1024, \u6240\u4ee5\u524d\u56db\u4e2a\u5b57\u8282\u8d4b\u503c\u4e3a 1024 (\u65e2\u7136\u6211\u4eec\u8981\u6784\u9020\u4e0d\u5b9a\u957f\u6570\u636e\u5305\uff0c\u90a3\u4e48\u8fd9\u4e2a\u5305\u5230\u5e95\u6709\u591a\u957f\u5462\uff0c\u56e0\u6b64\uff0c\u6211\u4eec\u5c31\u5fc5\u987b\u901a\u8fc7\u4e00\u4e2a\u53d8\u91cf\u6765\u8868\u660e\u8fd9\u4e2a\u6570\u636e\u5305\u7684\u957f\u5ea6\uff0c\u8fd9\u5c31\u662flen\u7684\u4f5c\u7528)\uff0c<\/p>\n<p>\u800c\u7d27\u63a5\u5176\u540e\u7684\u5185\u5b58\u662f\u771f\u6b63\u7684\u6570\u636e\u90e8\u5206, \u901a\u8fc7 p-&gt;data, \u6700\u540e, \u8fdb\u884c\u4e00\u4e2a memcpy() \u5185\u5b58\u62f7\u8d1d, \u628a\u8981\u53d1\u9001\u7684\u6570\u636e\u586b\u5165\u5230\u8fd9\u6bb5\u5185\u5b58\u5f53\u4e2d<\/p>\n<p>\u91ca\u653e<br \/>\n\u90a3\u4e48\u5f53\u4f7f\u7528\u5b8c\u6bd5\u91ca\u653e\u6570\u636e\u7684\u7a7a\u95f4\u7684\u65f6\u5019, \u76f4\u63a5\u91ca\u653e\u5c31\u53ef\u4ee5\u4e86<\/p>\n<p>\/\/\/ \u9500\u6bc1<br \/>\nfree(mbuffer);<br \/>\nmbuffer = NULL;<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n\u5c0f\u7ed3<\/p>\n<p>\u4f7f\u7528\u5b9a\u957f\u6570\u7ec4, \u4f5c\u4e3a\u6570\u636e\u7f13\u51b2\u533a, \u4e3a\u4e86\u907f\u514d\u9020\u6210\u7f13\u51b2\u533a\u6ea2\u51fa, \u6570\u7ec4\u7684\u5927\u5c0f\u4e00\u822c\u8bbe\u4e3a\u8db3\u591f\u7684\u7a7a\u95f4 MAX_LENGTH, \u800c\u5b9e\u9645\u4f7f\u7528\u8fc7\u7a0b\u4e2d, \u8fbe\u5230 MAX_LENGTH \u957f\u5ea6\u7684\u6570\u636e\u5f88\u5c11, \u90a3\u4e48\u591a\u6570\u60c5\u51b5\u4e0b, \u7f13\u51b2\u533a\u7684\u5927\u90e8\u5206\u7a7a\u95f4\u90fd\u662f\u6d6a\u8d39\u6389\u7684.<\/p>\n<p>\u4f46\u662f\u4f7f\u7528\u8fc7\u7a0b\u5f88\u7b80\u5355, \u6570\u636e\u7a7a\u95f4\u7684\u5f00\u8f9f\u548c\u91ca\u653e\u7b80\u5355, \u65e0\u9700\u7a0b\u5e8f\u5458\u8003\u8651\u989d\u5916\u7684\u64cd\u4f5c<\/p>\n<p>2.2 \u6307\u9488\u6570\u636e\u5305(\u5f00\u8f9f\u7a7a\u95f4, \u91ca\u653e, \u8bbf\u95ee)<br \/>\n\u5982\u679c\u4f60\u5c06\u4e0a\u9762\u7684\u957f\u5ea6\u4e3a MAX_LENGTH \u7684\u5b9a\u957f\u6570\u7ec4\u6362\u4e3a\u6307\u9488, \u6bcf\u6b21\u4f7f\u7528\u65f6\u52a8\u6001\u7684\u5f00\u8f9f CURR_LENGTH \u5927\u5c0f\u7684\u7a7a\u95f4, \u90a3\u4e48\u5c31\u907f\u514d\u9020\u6210 MAX_LENGTH &#8211; CURR_LENGTH \u7a7a\u95f4\u7684\u6d6a\u8d39, \u53ea\u6d6a\u8d39\u4e86\u4e00\u4e2a\u6307\u9488\u57df\u7684\u7a7a\u95f4.<\/p>\n<p>\u6570\u636e\u5305\u5b9a\u4e49<br \/>\nstruct point_buffer<br \/>\n{<br \/>\nint len;<br \/>\nchar *data;<br \/>\n};<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n\u6570\u636e\u7ed3\u6784\u5927\u5c0f<br \/>\n\u8003\u8651\u5bf9\u9f50, \u90a3\u4e48\u6570\u636e\u7ed3\u6784\u7684\u5927\u5c0f &gt;= sizeof(int) + sizeof(char *)<\/p>\n<p>\u7a7a\u95f4\u5206\u914d<br \/>\n\u4f46\u662f\u4e5f\u9020\u6210\u4e86\u4f7f\u7528\u5728\u5206\u914d\u5185\u5b58\u65f6\uff0c\u9700\u91c7\u7528\u4e24\u6b65<\/p>\n<p>\/\/ =====================<br \/>\n\/\/ \u6307\u9488\u6570\u7ec4 \u5360\u7528-\u5f00\u8f9f-\u9500\u6bc1<br \/>\n\/\/ =====================<br \/>\n\/\/\/ \u5360\u7528<br \/>\nprintf(&#8220;the length of struct test3:%d\\n&#8221;,sizeof(struct point_buffer));<br \/>\n\/\/\/ \u5f00\u8f9f<br \/>\nif ((pbuffer = (struct point_buffer *)malloc(sizeof(struct point_buffer))) != NULL)<br \/>\n{<br \/>\npbuffer-&gt;len = CURR_LENGTH;<br \/>\nif ((pbuffer-&gt;data = (char *)malloc(sizeof(char) * CURR_LENGTH)) != NULL)<br \/>\n{<br \/>\nmemcpy(pbuffer-&gt;data, &#8220;Hello World&#8221;, CURR_LENGTH);<\/p>\n<p>printf(&#8220;%d, %s\\n&#8221;, pbuffer-&gt;len, pbuffer-&gt;data);<br \/>\n}<br \/>\n}<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<br \/>\n10<br \/>\n11<br \/>\n12<br \/>\n13<br \/>\n14<br \/>\n15<br \/>\n16<br \/>\n17<br \/>\n\u9996\u5148, \u9700\u4e3a\u7ed3\u6784\u4f53\u5206\u914d\u4e00\u5757\u5185\u5b58\u7a7a\u95f4;<\/p>\n<p>\u5176\u6b21\u518d\u4e3a\u7ed3\u6784\u4f53\u4e2d\u7684\u6210\u5458\u53d8\u91cf\u5206\u914d\u5185\u5b58\u7a7a\u95f4.<\/p>\n<p>\u8fd9\u6837\u4e24\u6b21\u5206\u914d\u7684\u5185\u5b58\u662f\u4e0d\u8fde\u7eed\u7684, \u9700\u8981\u5206\u522b\u5bf9\u5176\u8fdb\u884c\u7ba1\u7406. \u5f53\u4f7f\u7528\u957f\u5ea6\u4e3a\u7684\u6570\u7ec4\u65f6, \u5219\u662f\u91c7\u7528\u4e00\u6b21\u5206\u914d\u7684\u539f\u5219, \u4e00\u6b21\u6027\u5c06\u6240\u9700\u7684\u5185\u5b58\u5168\u90e8\u5206\u914d\u7ed9\u5b83.<\/p>\n<p>\u91ca\u653e<br \/>\n\u76f8\u53cd, \u91ca\u653e\u65f6\u4e5f\u662f\u4e00\u6837\u7684.<\/p>\n<p>\/\/\/ \u9500\u6bc1<br \/>\nfree(pbuffer-&gt;data);<br \/>\nfree(pbuffer);<br \/>\npbuffer = NULL;<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n\u5c0f\u7ed3<\/p>\n<p>\u4f7f\u7528\u6307\u9488\u7ed3\u679c\u4f5c\u4e3a\u7f13\u51b2\u533a, \u53ea\u591a\u4f7f\u7528\u4e86\u4e00\u4e2a\u6307\u9488\u5927\u5c0f\u7684\u7a7a\u95f4, \u65e0\u9700\u4f7f\u7528 MAX_LENGTH \u957f\u5ea6\u7684\u6570\u7ec4, \u4e0d\u4f1a\u9020\u6210\u7a7a\u95f4\u7684\u5927\u91cf\u6d6a\u8d39.<\/p>\n<p>\u4f46\u90a3\u662f\u5f00\u8f9f\u7a7a\u95f4\u65f6, \u9700\u8981\u989d\u5916\u5f00\u8f9f\u6570\u636e\u57df\u7684\u7a7a\u95f4, \u65bd\u653e\u65f6\u5019\u4e5f\u9700\u8981\u663e\u793a\u91ca\u653e\u6570\u636e\u57df\u7684\u7a7a\u95f4, \u4f46\u662f\u5b9e\u9645\u4f7f\u7528\u8fc7\u7a0b\u4e2d, \u5f80\u5f80\u5728\u51fd\u6570\u4e2d\u5f00\u8f9f\u7a7a\u95f4, \u7136\u540e\u8fd4\u56de\u7ed9\u4f7f\u7528\u8005\u6307\u5411 struct point_buffer \u7684\u6307\u9488, \u8fd9\u65f6\u5019\u6211\u4eec\u5e76\u4e0d\u80fd\u5047\u5b9a\u4f7f\u7528\u8005\u4e86\u89e3\u6211\u4eec\u5f00\u8f9f\u7684\u7ec6\u8282, \u5e76\u6309\u7167\u7ea6\u5b9a\u7684\u64cd\u4f5c\u91ca\u653e\u7a7a\u95f4, \u56e0\u6b64\u4f7f\u7528\u8d77\u6765\u591a\u6709\u4e0d\u4fbf, \u751a\u81f3\u9020\u6210\u5185\u5b58\u6cc4\u6f0f<\/p>\n<p>2.3 \u53d8\u957f\u6570\u636e\u7f13\u51b2\u533a(\u5f00\u8f9f\u7a7a\u95f4, \u91ca\u653e, \u8bbf\u95ee)<br \/>\n\u5b9a\u957f\u6570\u7ec4\u4f7f\u7528\u65b9\u4fbf, \u4f46\u662f\u5374\u6d6a\u8d39\u7a7a\u95f4, \u6307\u9488\u5f62\u5f0f\u53ea\u591a\u4f7f\u7528\u4e86\u4e00\u4e2a\u6307\u9488\u7684\u7a7a\u95f4, \u4e0d\u4f1a\u9020\u6210\u5927\u91cf\u7a7a\u95f4\u5206\u6d6a\u8d39, \u4f46\u662f\u4f7f\u7528\u8d77\u6765\u9700\u8981\u591a\u6b21\u5206\u914d, \u591a\u6b21\u91ca\u653e, \u90a3\u4e48\u6709\u6ca1\u6709\u4e00\u79cd\u5b9e\u73b0\u65b9\u5f0f\u80fd\u591f\u65e2\u4e0d\u6d6a\u8d39\u7a7a\u95f4, \u53c8\u4f7f\u7528\u65b9\u4fbf\u7684\u5462?<\/p>\n<p>GNU C \u76840\u957f\u5ea6\u6570\u7ec4, \u4e5f\u53eb\u53d8\u957f\u6570\u7ec4, \u67d4\u6027\u6570\u7ec4\u5c31\u662f\u8fd9\u6837\u4e00\u4e2a\u6269\u5c55. \u5bf9\u4e8e0\u957f\u6570\u7ec4\u7684\u8fd9\u4e2a\u7279\u70b9\uff0c\u5f88\u5bb9\u6613\u6784\u9020\u51fa\u53d8\u6210\u7ed3\u6784\u4f53\uff0c\u5982\u7f13\u51b2\u533a\uff0c\u6570\u636e\u5305\u7b49\u7b49\uff1a<\/p>\n<p>\u6570\u636e\u7ed3\u6784\u5b9a\u4e49<br \/>\n\/\/ 0\u957f\u5ea6\u6570\u7ec4<br \/>\nstruct zero_buffer<br \/>\n{<br \/>\nint len;<br \/>\nchar data[0];<br \/>\n};<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n\u6570\u636e\u7ed3\u6784\u5927\u5c0f<br \/>\n\u8fd9\u6837\u7684\u53d8\u957f\u6570\u7ec4\u5e38\u7528\u4e8e\u7f51\u7edc\u901a\u4fe1\u4e2d\u6784\u9020\u4e0d\u5b9a\u957f\u6570\u636e\u5305, \u4e0d\u4f1a\u6d6a\u8d39\u7a7a\u95f4\u6d6a\u8d39\u7f51\u7edc\u6d41\u91cf, \u56e0\u4e3achar data[0]; \u53ea\u662f\u4e2a\u6570\u7ec4\u540d, \u662f\u4e0d\u5360\u7528\u5b58\u50a8\u7a7a\u95f4\u7684,<\/p>\n<p>\u5373 sizeof(struct zero_buffer) = sizeof(int)<\/p>\n<p>\u5f00\u8f9f\u7a7a\u95f4<br \/>\n\u90a3\u4e48\u6211\u4eec\u4f7f\u7528\u7684\u65f6\u5019, \u53ea\u9700\u8981\u5f00\u8f9f\u4e00\u6b21\u7a7a\u95f4\u5373\u53ef<\/p>\n<p>\/\/\/ \u5f00\u8f9f<br \/>\nif ((zbuffer = (struct zero_buffer *)malloc(sizeof(struct zero_buffer) + sizeof(char) * CURR_LENGTH)) != NULL)<br \/>\n{<br \/>\nzbuffer-&gt;len = CURR_LENGTH;<br \/>\nmemcpy(zbuffer-&gt;data, &#8220;Hello World&#8221;, CURR_LENGTH);<\/p>\n<p>printf(&#8220;%d, %s\\n&#8221;, zbuffer-&gt;len, zbuffer-&gt;data);<br \/>\n}<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<br \/>\n\u91ca\u653e\u7a7a\u95f4<br \/>\n\u91ca\u653e\u7a7a\u95f4\u4e5f\u662f\u4e00\u6837\u7684, \u4e00\u6b21\u91ca\u653e\u5373\u53ef<\/p>\n<p>\/\/\/ \u9500\u6bc1<br \/>\nfree(zbuffer);<br \/>\nzbuffer = NULL;<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n2.4 \u603b\u7ed3<br \/>\n\/\/ zero_length_array.c<br \/>\n#include &lt;stdio.h&gt;<br \/>\n#include &lt;stdlib.h&gt;<\/p>\n<p>#define MAX_LENGTH 1024<br \/>\n#define CURR_LENGTH 512<\/p>\n<p>\/\/ 0\u957f\u5ea6\u6570\u7ec4<br \/>\nstruct zero_buffer<br \/>\n{<br \/>\nint len;<br \/>\nchar data[0];<br \/>\n}__attribute((packed));<\/p>\n<p>\/\/ \u5b9a\u957f\u6570\u7ec4<br \/>\nstruct max_buffer<br \/>\n{<br \/>\nint len;<br \/>\nchar data[MAX_LENGTH];<br \/>\n}__attribute((packed));<\/p>\n<p>\/\/ \u6307\u9488\u6570\u7ec4<br \/>\nstruct point_buffer<br \/>\n{<br \/>\nint len;<br \/>\nchar *data;<br \/>\n}__attribute((packed));<\/p>\n<p>int main(void)<br \/>\n{<br \/>\nstruct zero_buffer *zbuffer = NULL;<br \/>\nstruct max_buffer *mbuffer = NULL;<br \/>\nstruct point_buffer *pbuffer = NULL;<\/p>\n<p>\/\/ =====================<br \/>\n\/\/ 0\u957f\u5ea6\u6570\u7ec4 \u5360\u7528-\u5f00\u8f9f-\u9500\u6bc1<br \/>\n\/\/ =====================<br \/>\n\/\/\/ \u5360\u7528<br \/>\nprintf(&#8220;the length of struct test1:%d\\n&#8221;,sizeof(struct zero_buffer));<br \/>\n\/\/\/ \u5f00\u8f9f<br \/>\nif ((zbuffer = (struct zero_buffer *)malloc(sizeof(struct zero_buffer) + sizeof(char) * CURR_LENGTH)) != NULL)<br \/>\n{<br \/>\nzbuffer-&gt;len = CURR_LENGTH;<br \/>\nmemcpy(zbuffer-&gt;data, &#8220;Hello World&#8221;, CURR_LENGTH);<\/p>\n<p>printf(&#8220;%d, %s\\n&#8221;, zbuffer-&gt;len, zbuffer-&gt;data);<br \/>\n}<br \/>\n\/\/\/ \u9500\u6bc1<br \/>\nfree(zbuffer);<br \/>\nzbuffer = NULL;<\/p>\n<p>\/\/ =====================<br \/>\n\/\/ \u5b9a\u957f\u6570\u7ec4 \u5360\u7528-\u5f00\u8f9f-\u9500\u6bc1<br \/>\n\/\/ =====================<br \/>\n\/\/\/ \u5360\u7528<br \/>\nprintf(&#8220;the length of struct test2:%d\\n&#8221;,sizeof(struct max_buffer));<br \/>\n\/\/\/ \u5f00\u8f9f<br \/>\nif ((mbuffer = (struct max_buffer *)malloc(sizeof(struct max_buffer))) != NULL)<br \/>\n{<br \/>\nmbuffer-&gt;len = CURR_LENGTH;<br \/>\nmemcpy(mbuffer-&gt;data, &#8220;Hello World&#8221;, CURR_LENGTH);<\/p>\n<p>printf(&#8220;%d, %s\\n&#8221;, mbuffer-&gt;len, mbuffer-&gt;data);<br \/>\n}<br \/>\n\/\/\/ \u9500\u6bc1<br \/>\nfree(mbuffer);<br \/>\nmbuffer = NULL;<\/p>\n<p>\/\/ =====================<br \/>\n\/\/ \u6307\u9488\u6570\u7ec4 \u5360\u7528-\u5f00\u8f9f-\u9500\u6bc1<br \/>\n\/\/ =====================<br \/>\n\/\/\/ \u5360\u7528<br \/>\nprintf(&#8220;the length of struct test3:%d\\n&#8221;,sizeof(struct point_buffer));<br \/>\n\/\/\/ \u5f00\u8f9f<br \/>\nif ((pbuffer = (struct point_buffer *)malloc(sizeof(struct point_buffer))) != NULL)<br \/>\n{<br \/>\npbuffer-&gt;len = CURR_LENGTH;<br \/>\nif ((pbuffer-&gt;data = (char *)malloc(sizeof(char) * CURR_LENGTH)) != NULL)<br \/>\n{<br \/>\nmemcpy(pbuffer-&gt;data, &#8220;Hello World&#8221;, CURR_LENGTH);<\/p>\n<p>printf(&#8220;%d, %s\\n&#8221;, pbuffer-&gt;len, pbuffer-&gt;data);<br \/>\n}<br \/>\n}<br \/>\n\/\/\/ \u9500\u6bc1<br \/>\nfree(pbuffer-&gt;data);<br \/>\nfree(pbuffer);<br \/>\npbuffer = NULL;<\/p>\n<p>return EXIT_SUCCESS;<br \/>\n}<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<br \/>\n10<br \/>\n11<br \/>\n12<br \/>\n13<br \/>\n14<br \/>\n15<br \/>\n16<br \/>\n17<br \/>\n18<br \/>\n19<br \/>\n20<br \/>\n21<br \/>\n22<br \/>\n23<br \/>\n24<br \/>\n25<br \/>\n26<br \/>\n27<br \/>\n28<br \/>\n29<br \/>\n30<br \/>\n31<br \/>\n32<br \/>\n33<br \/>\n34<br \/>\n35<br \/>\n36<br \/>\n37<br \/>\n38<br \/>\n39<br \/>\n40<br \/>\n41<br \/>\n42<br \/>\n43<br \/>\n44<br \/>\n45<br \/>\n46<br \/>\n47<br \/>\n48<br \/>\n49<br \/>\n50<br \/>\n51<br \/>\n52<br \/>\n53<br \/>\n54<br \/>\n55<br \/>\n56<br \/>\n57<br \/>\n58<br \/>\n59<br \/>\n60<br \/>\n61<br \/>\n62<br \/>\n63<br \/>\n64<br \/>\n65<br \/>\n66<br \/>\n67<br \/>\n68<br \/>\n69<br \/>\n70<br \/>\n71<br \/>\n72<br \/>\n73<br \/>\n74<br \/>\n75<br \/>\n76<br \/>\n77<br \/>\n78<br \/>\n79<br \/>\n80<br \/>\n81<br \/>\n82<br \/>\n83<br \/>\n84<br \/>\n85<br \/>\n86<br \/>\n87<br \/>\n88<br \/>\n89<br \/>\n90<br \/>\n91<br \/>\n92<br \/>\n93<br \/>\n94<br \/>\n95<br \/>\n96<br \/>\n97<br \/>\n98<br \/>\n99<br \/>\n100<\/p>\n<p>\u957f\u5ea6\u4e3a0\u7684\u6570\u7ec4\u5e76\u4e0d\u5360\u6709\u5185\u5b58\u7a7a\u95f4, \u800c\u6307\u9488\u65b9\u5f0f\u9700\u8981\u5360\u7528\u5185\u5b58\u7a7a\u95f4.<\/p>\n<p>\u5bf9\u4e8e\u957f\u5ea6\u4e3a0\u6570\u7ec4, \u5728\u7533\u8bf7\u5185\u5b58\u7a7a\u95f4\u65f6, \u91c7\u7528\u4e00\u6b21\u6027\u5206\u914d\u7684\u539f\u5219\u8fdb\u884c; \u5bf9\u4e8e\u5305\u542b\u6307\u9488\u7684\u7ed3\u6784\u4f53, \u624d\u7533\u8bf7\u7a7a\u95f4\u65f6\u9700\u5206\u522b\u8fdb\u884c, \u91ca\u653e\u65f6\u4e5f\u9700\u5206\u522b\u91ca\u653e.<\/p>\n<p>\u5bf9\u4e8e\u957f\u5ea6\u4e3a\u7684\u6570\u7ec4\u7684\u8bbf\u95ee\u53ef\u91c7\u7528\u6570\u7ec4\u65b9\u5f0f\u8fdb\u884c<\/p>\n<p>3 GNU Document\u4e2d \u53d8\u957f\u6570\u7ec4\u7684\u652f\u6301<br \/>\n\u53c2\u89c1<\/p>\n<p>6.17 Arrays of Length Zero<\/p>\n<p>C Struct Hack \u2013 Structure with variable length array<\/p>\n<p>\u5728 C90 \u4e4b\u524d, \u5e76\u4e0d\u652f\u63010\u957f\u5ea6\u7684\u6570\u7ec4, 0\u957f\u5ea6\u6570\u7ec4\u662f GNU C \u7684\u4e00\u4e2a\u6269\u5c55, \u56e0\u6b64\u65e9\u671f\u7684\u7f16\u8bd1\u5668\u4e2d\u662f\u65e0\u6cd5\u901a\u8fc7\u7f16\u8bd1\u7684<\/p>\n<p>\u5bf9\u4e8e GNU C \u589e\u52a0\u7684\u6269\u5c55, GCC \u63d0\u4f9b\u4e86\u7f16\u8bd1\u9009\u9879\u6765\u660e\u786e\u7684\u6807\u8bc6\u51fa\u4ed6\u4eec<\/p>\n<p>1\u3001-pedantic \u9009\u9879\uff0c\u90a3\u4e48\u4f7f\u7528\u4e86\u6269\u5c55\u8bed\u6cd5\u7684\u5730\u65b9\u5c06\u4ea7\u751f\u76f8\u5e94\u7684\u8b66\u544a\u4fe1\u606f<\/p>\n<p>2\u3001-Wall \u4f7f\u7528\u5b83\u80fd\u591f\u4f7fGCC\u4ea7\u751f\u5c3d\u53ef\u80fd\u591a\u7684\u8b66\u544a\u4fe1\u606f<\/p>\n<p>3\u3001-Werror, \u5b83\u8981\u6c42GCC\u5c06\u6240\u6709\u7684\u8b66\u544a\u5f53\u6210\u9519\u8bef\u8fdb\u884c\u5904\u7406<\/p>\n<p>\/\/ 1.c<br \/>\n#include &lt;stdio.h&gt;<br \/>\n#include &lt;stdlib.h&gt;<\/p>\n<p>int main(void)<br \/>\n{<br \/>\nchar a[0];<br \/>\nprintf(&#8220;%ld&#8221;, sizeof(a));<br \/>\nreturn EXIT_SUCCESS;<br \/>\n}<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<br \/>\n10<br \/>\n11<br \/>\n\u6211\u4eec\u6765\u7f16\u8bd1<\/p>\n<p>gcc 1.c -Wall # \u663e\u793a\u6240\u6709\u8b66\u544a<br \/>\n#none warning and error<\/p>\n<p>gcc 1.c -Wall -pedantic # \u5bf9GNU C\u7684\u6269\u5c55\u663e\u793a\u8b66\u544a<br \/>\n1.c: In function \u2018main\u2019:<br \/>\n1.c:7: warning: ISO C forbids zero-size array \u2018a\u2019<\/p>\n<p>gcc 1.c -Werror -Wall -pedantic # \u663e\u793a\u6240\u6709\u8b66\u544a\u540c\u65f6GNU C\u7684\u6269\u5c55\u663e\u793a\u8b66\u544a, \u5c06\u8b66\u544a\u7528error\u663e\u793a<br \/>\ncc1: warnings being treated as errors<br \/>\n1.c: In function \u2018main\u2019:<br \/>\n1.c:7: error: ISO C forbids zero-size array \u2018a\u2019<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<br \/>\n10<br \/>\n11<br \/>\n12<\/p>\n<p>0\u957f\u5ea6\u6570\u7ec4\u5176\u5b9e\u5c31\u662f\u7075\u6d3b\u7684\u8fd0\u7528\u7684\u6570\u7ec4\u6307\u5411\u7684\u662f\u5176\u540e\u9762\u7684\u8fde\u7eed\u7684\u5185\u5b58\u7a7a\u95f4<\/p>\n<p>struct buffer<br \/>\n{<br \/>\nint len;<br \/>\nchar data[0];<br \/>\n};<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n\u5728\u65e9\u671f\u6ca1\u5f15\u51650\u957f\u5ea6\u6570\u7ec4\u7684\u65f6\u5019, \u5927\u5bb6\u662f\u901a\u8fc7\u5b9a\u957f\u6570\u7ec4\u548c\u6307\u9488\u7684\u65b9\u5f0f\u6765\u89e3\u51b3\u7684, \u4f46\u662f<\/p>\n<p>\u5b9a\u957f\u6570\u7ec4\u5b9a\u4e49\u4e86\u4e00\u4e2a\u8db3\u591f\u5927\u7684\u7f13\u51b2\u533a, \u8fd9\u6837\u4f7f\u7528\u65b9\u4fbf, \u4f46\u662f\u6bcf\u6b21\u90fd\u9020\u6210\u7a7a\u95f4\u7684\u6d6a\u8d39<br \/>\n\u6307\u9488\u7684\u65b9\u5f0f, \u8981\u6c42\u7a0b\u5e8f\u5458\u5728\u91ca\u653e\u7a7a\u95f4\u662f\u5fc5\u987b\u8fdb\u884c\u591a\u6b21\u7684free\u64cd\u4f5c, \u800c\u6211\u4eec\u5728\u4f7f\u7528\u7684\u8fc7\u7a0b\u4e2d\u5f80\u5f80\u5728\u51fd\u6570\u4e2d\u8fd4\u56de\u4e86\u6307\u5411\u7f13\u51b2\u533a\u7684\u6307\u9488, \u6211\u4eec\u5e76\u4e0d\u80fd\u4fdd\u8bc1\u6bcf\u4e2a\u4eba\u90fd\u7406\u89e3\u5e76\u9075\u4ece\u6211\u4eec\u7684\u91ca\u653e\u65b9\u5f0f<br \/>\n\u6240\u4ee5 GNU \u5c31\u5bf9\u5176\u8fdb\u884c\u4e860\u957f\u5ea6\u6570\u7ec4\u7684\u6269\u5c55. \u5f53\u4f7f\u7528data[0]\u7684\u65f6\u5019, \u4e5f\u5c31\u662f0\u957f\u5ea6\u6570\u7ec4\u7684\u65f6\u5019\uff0c0\u957f\u5ea6\u6570\u7ec4\u4f5c\u4e3a\u6570\u7ec4\u540d, \u5e76\u4e0d\u5360\u7528\u5b58\u50a8\u7a7a\u95f4.<\/p>\n<p>\u5728C99\u4e4b\u540e\uff0c\u4e5f\u52a0\u4e86\u7c7b\u4f3c\u7684\u6269\u5c55\uff0c\u53ea\u4e0d\u8fc7\u7528\u7684\u662f char payload[]\u8fd9\u79cd\u5f62\u5f0f\uff08\u6240\u4ee5\u5982\u679c\u4f60\u5728\u7f16\u8bd1\u7684\u65f6\u5019\u786e\u5b9e\u9700\u8981\u7528\u5230-pedantic\u53c2\u6570\uff0c\u90a3\u4e48\u4f60\u53ef\u4ee5\u5c06char payload[0]\u7c7b\u578b\u6539\u6210char payload[], \u8fd9\u6837\u5c31\u53ef\u4ee5\u7f16\u8bd1\u901a\u8fc7\u4e86\uff0c\u5f53\u7136\u4f60\u7684\u7f16\u8bd1\u5668\u5fc5\u987b\u652f\u6301C99\u6807\u51c6\u7684\uff0c\u5982\u679c\u592a\u53e4\u8001\u7684\u7f16\u8bd1\u5668\uff0c\u90a3\u53ef\u80fd\u4e0d\u652f\u6301\u4e86)<\/p>\n<p>\/\/ 2.c payload<br \/>\n#include &lt;stdio.h&gt;<br \/>\n#include &lt;stdlib.h&gt;<\/p>\n<p>struct payload<br \/>\n{<br \/>\nint len;<br \/>\nchar data[];<br \/>\n};<\/p>\n<p>int main(void)<br \/>\n{<br \/>\nstruct payload pay;<br \/>\nprintf(&#8220;%ld&#8221;, sizeof(pay));<br \/>\nreturn EXIT_SUCCESS;<br \/>\n}<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<br \/>\n10<br \/>\n11<br \/>\n12<br \/>\n13<br \/>\n14<br \/>\n15<br \/>\n16<br \/>\n\u4f7f\u7528 -pedantic \u7f16\u8bd1\u540e, \u4e0d\u51fa\u73b0\u8b66\u544a, \u8bf4\u660e\u8fd9\u79cd\u8bed\u6cd5\u662f C \u6807\u51c6\u7684<\/p>\n<p>gcc 2.c -pedantic -std=c99<br \/>\n1<\/p>\n<p>\u6240\u4ee5\u7ed3\u6784\u4f53\u7684\u672b\u5c3e, \u5c31\u662f\u6307\u5411\u4e86\u5176\u540e\u9762\u7684\u5185\u5b58\u6570\u636e\u3002\u56e0\u6b64\u6211\u4eec\u53ef\u4ee5\u5f88\u597d\u7684\u5c06\u8be5\u7c7b\u578b\u7684\u7ed3\u6784\u4f53\u4f5c\u4e3a\u6570\u636e\u62a5\u6587\u7684\u5934\u683c\u5f0f\uff0c\u5e76\u4e14\u6700\u540e\u4e00\u4e2a\u6210\u5458\u53d8\u91cf\uff0c\u4e5f\u5c31\u521a\u597d\u662f\u6570\u636e\u5185\u5bb9\u4e86.<\/p>\n<p>GNU\u624b\u518c\u8fd8\u63d0\u4f9b\u4e86\u53e6\u5916\u4e24\u4e2a\u7ed3\u6784\u4f53\u6765\u8bf4\u660e\uff0c\u66f4\u5bb9\u6613\u770b\u61c2\u610f\u601d\uff1a<\/p>\n<p>struct f1 {<br \/>\nint x;<br \/>\nint y[];<br \/>\n} f1 = { 1, { 2, 3, 4 } };<\/p>\n<p>struct f2 {<br \/>\nstruct f1 f1;<br \/>\nint data[3];<br \/>\n} f2 = { { 1 }, { 5, 6, 7 } };<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<br \/>\n\u6211\u628af2\u91cc\u9762\u76842,3,4\u6539\u6210\u4e865,6,7\u4ee5\u793a\u533a\u5206\u3002\u5982\u679c\u4f60\u628a\u6570\u636e\u6253\u51fa\u6765\u3002\u5373\u5982\u4e0b\u7684\u4fe1\u606f\uff1a<\/p>\n<p>f1.x = 1<br \/>\nf1.y[0] = 2<br \/>\nf1.y[1] = 3<br \/>\nf1.y[2] = 4<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n\u4e5f\u5c31\u662ff1.y\u6307\u5411\u7684\u662f{2,3,4}\u8fd9\u5757\u5185\u5b58\u4e2d\u7684\u6570\u636e\u3002\u6240\u4ee5\u6211\u4eec\u5c31\u53ef\u4ee5\u8f7b\u6613\u7684\u5f97\u5230\uff0cf2.f1.y\u6307\u5411\u7684\u6570\u636e\u4e5f\u5c31\u662f\u6b63\u597df2.data\u7684\u5185\u5bb9\u4e86\u3002\u6253\u5370\u51fa\u6765\u7684\u6570\u636e\uff1a<\/p>\n<p>f2.f1.x = 1<br \/>\nf2.f1.y[0] = 5<br \/>\nf2.f1.y[1] = 6<br \/>\nf2.f1.y[2] = 7<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n\u5982\u679c\u4f60\u4e0d\u662f\u5f88\u786e\u8ba4\u5176\u662f\u5426\u5360\u7528\u7a7a\u95f4. \u4f60\u53ef\u4ee5\u7528sizeof\u6765\u8ba1\u7b97\u4e00\u4e0b\u3002\u5c31\u53ef\u4ee5\u77e5\u9053sizeof(struct f1)=4,\u4e5f\u5c31\u662fint y[]\u5176\u5b9e\u662f\u4e0d\u5360\u7528\u7a7a\u95f4\u7684\u3002\u4f46\u662f\u8fd9\u4e2a0\u957f\u5ea6\u7684\u6570\u7ec4\uff0c\u5fc5\u987b\u653e\u5728\u7ed3\u6784\u4f53\u7684\u672b\u5c3e\u3002\u5982\u679c\u4f60\u6ca1\u6709\u628a\u5b83\u653e\u5728\u672b\u5c3e\u7684\u8bdd\u3002\u7f16\u8bd1\u7684\u65f6\u5019\uff0c\u4f1a\u6709\u5982\u4e0b\u7684\u9519\u8bef\uff1a<\/p>\n<p>main.c:37:9: error: flexible array member not at end of struct<br \/>\nint y[];<br \/>\n^<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n\u5230\u8fd9\u8fb9\uff0c\u4f60\u53ef\u80fd\u4f1a\u6709\u7591\u95ee\uff0c\u5982\u679c\u5c06struct f1\u4e2d\u7684int y[]\u66ff\u6362\u6210int *y\uff0c\u53c8\u4f1a\u662f\u5982\u4f55\uff1f\u8fd9\u5c31\u6d89\u53ca\u5230\u6570\u7ec4\u548c\u6307\u9488\u7684\u95ee\u9898\u4e86. \u6709\u65f6\u5019\u5427\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u6837\u7684\uff0c\u6709\u65f6\u5019\u53c8\u6709\u533a\u522b\u3002<\/p>\n<p>\u9996\u5148\u8981\u8bf4\u660e\u7684\u662f\uff0c\u652f\u63010\u957f\u5ea6\u6570\u7ec4\u7684\u6269\u5c55\uff0c\u91cd\u70b9\u5728\u6570\u7ec4\uff0c\u4e5f\u5c31\u662f\u4e0d\u80fd\u7528int *y\u6307\u9488\u6765\u66ff\u6362\u3002sizeof\u7684\u957f\u5ea6\u5c31\u4e0d\u4e00\u6837\u4e86\u3002\u628astruct f1\u6539\u6210\u8fd9\u6837\uff1a<\/p>\n<p>struct f3 {<br \/>\nint x;<br \/>\nint *y;<br \/>\n};<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n\u572832\/64\u4f4d\u4e0b, int\u5747\u662f4\u4e2a\u5b57\u8282, sizeof(struct f1)=4\uff0c\u800csizeof(struct f3)=16<\/p>\n<p>\u56e0\u4e3a int *y \u662f\u6307\u9488, \u6307\u9488\u572864\u4f4d\u4e0b, \u662f64\u4f4d\u7684\uff0c sizeof(struct f3) = 16, \u5982\u679c\u572832\u4f4d\u73af\u5883\u7684\u8bdd, sizeof(struct f3) \u5219\u662f 8 \u4e86, sizeof(struct f1) \u4e0d\u53d8. \u6240\u4ee5 int *y \u662f\u4e0d\u80fd\u66ff\u4ee3 int y[] \u7684.<\/p>\n<p>\u4ee3\u7801\u5982\u4e0b<\/p>\n<p>\/\/ 3.c<br \/>\n#include &lt;stdio.h&gt;<br \/>\n#include &lt;stdlib.h&gt;<\/p>\n<p>struct f1 {<br \/>\nint x;<br \/>\nint y[];<br \/>\n} f1 = { 1, { 2, 3, 4 } };<\/p>\n<p>struct f2 {<br \/>\nstruct f1 f1;<br \/>\nint data[3];<br \/>\n} f2 = { { 1 }, { 5, 6, 7 } };<\/p>\n<p>struct f3<br \/>\n{<br \/>\nint x;<br \/>\nint *y;<br \/>\n};<\/p>\n<p>int main(void)<br \/>\n{<br \/>\nprintf(&#8220;sizeof(f1) = %d\\n&#8221;, sizeof(struct f1));<br \/>\nprintf(&#8220;sizeof(f2) = %d\\n&#8221;, sizeof(struct f2));<br \/>\nprintf(&#8220;szieof(f3) = %d\\n\\n&#8221;, sizeof(struct f3));<\/p>\n<p>printf(&#8220;f1.x = %d\\n&#8221;, f1.x);<br \/>\nprintf(&#8220;f1.y[0] = %d\\n&#8221;, f1.y[0]);<br \/>\nprintf(&#8220;f1.y[1] = %d\\n&#8221;, f1.y[1]);<br \/>\nprintf(&#8220;f1.y[2] = %d\\n&#8221;, f1.y[2]);<\/p>\n<p>printf(&#8220;f2.f1.x = %d\\n&#8221;, f1.x);<br \/>\nprintf(&#8220;f2.f1.y[0] = %d\\n&#8221;, f2.f1.y[0]);<br \/>\nprintf(&#8220;f2.f1.y[1] = %d\\n&#8221;, f2.f1.y[1]);<br \/>\nprintf(&#8220;f2.f1.y[2] = %d\\n&#8221;, f2.f1.y[2]);<\/p>\n<p>return EXIT_SUCCESS;<br \/>\n}<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<br \/>\n10<br \/>\n11<br \/>\n12<br \/>\n13<br \/>\n14<br \/>\n15<br \/>\n16<br \/>\n17<br \/>\n18<br \/>\n19<br \/>\n20<br \/>\n21<br \/>\n22<br \/>\n23<br \/>\n24<br \/>\n25<br \/>\n26<br \/>\n27<br \/>\n28<br \/>\n29<br \/>\n30<br \/>\n31<br \/>\n32<br \/>\n33<br \/>\n34<br \/>\n35<br \/>\n36<br \/>\n37<br \/>\n38<br \/>\n39<br \/>\n40<br \/>\n41<\/p>\n<p>4 0\u957f\u5ea6\u6570\u7ec4\u7684\u5176\u4ed6\u7279\u5f81<br \/>\n4.1 \u4e3a\u4ec0\u4e480\u957f\u5ea6\u6570\u7ec4\u4e0d\u5360\u7528\u5b58\u50a8\u7a7a\u95f4<br \/>\n\u53c2\u89c1<\/p>\n<p>\u7ed3\u6784\u4f53\u4e2d\u7684\u6307\u9488\u4e0e\u96f6\u957f\u5ea6\u6570\u7ec4<\/p>\n<p>GNU C\u4e2d\u7684\u96f6\u957f\u5ea6\u6570\u7ec4<\/p>\n<p>0\u957f\u5ea6\u6570\u7ec4\u4e0e\u6307\u9488\u5b9e\u73b0\u6709\u4ec0\u4e48\u533a\u522b\u5462, \u4e3a\u4ec0\u4e480\u957f\u5ea6\u6570\u7ec4\u4e0d\u5360\u7528\u5b58\u50a8\u7a7a\u95f4\u5462?<\/p>\n<p>\u5176\u5b9e\u672c\u8d28\u4e0a\u6d89\u53ca\u5230\u7684\u662f\u4e00\u4e2aC\u8bed\u8a00\u91cc\u9762\u7684\u6570\u7ec4\u548c\u6307\u9488\u7684\u533a\u522b\u95ee\u9898. char a[1]\u91cc\u9762\u7684a\u548cchar *b\u7684b\u76f8\u540c\u5417\uff1f<\/p>\n<p>\u300a Programming Abstractions in C\u300b\uff08Roberts, E. S.\uff0c\u673a\u68b0\u5de5\u4e1a\u51fa\u7248\u793e\uff0c2004.6\uff0982\u9875\u91cc\u9762\u8bf4<\/p>\n<p>\u201carr is defined to be identical to &amp;arr[0]\u201d.<\/p>\n<p>\u4e5f\u5c31\u662f\u8bf4\uff0cchar a[1]\u91cc\u9762\u7684a\u5b9e\u9645\u662f\u4e00\u4e2a\u5e38\u91cf\uff0c\u7b49\u4e8e&amp;a[0]\u3002\u800cchar *b\u662f\u6709\u4e00\u4e2a\u5b9e\u5b9e\u5728\u5728\u7684\u6307\u9488\u53d8\u91cfb\u5b58\u5728\u3002 \u6240\u4ee5\uff0ca=b\u662f\u4e0d\u5141\u8bb8\u7684\uff0c\u800cb=a\u662f\u5141\u8bb8\u7684\u3002 \u4e24\u79cd\u53d8\u91cf\u90fd\u652f\u6301\u4e0b\u6807\u5f0f\u7684\u8bbf\u95ee\uff0c\u90a3\u4e48\u5bf9\u4e8ea[0]\u548cb[0]\u672c\u8d28\u4e0a\u662f\u5426\u6709\u533a\u522b\uff1f\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4e00\u4e2a\u4f8b\u5b50\u6765\u8bf4\u660e\u3002<\/p>\n<p>\u53c2\u89c1\u5982\u4e0b\u4e24\u4e2a\u7a0b\u5e8f gdb_zero_length_array.c \u548c gdb_zero_length_array.c<\/p>\n<p>\/\/ gdb_zero_length_array.c<br \/>\n#include &lt;stdio.h&gt;<br \/>\n#include &lt;stdlib.h&gt;<\/p>\n<p>struct str<br \/>\n{<br \/>\nint len;<br \/>\nchar s[0];<br \/>\n};<\/p>\n<p>struct foo<br \/>\n{<br \/>\nstruct str *a;<br \/>\n};<\/p>\n<p>int main(void)<br \/>\n{<br \/>\nstruct foo f = { NULL };<\/p>\n<p>printf(&#8220;sizeof(struct str) = %d\\n&#8221;, sizeof(struct str));<\/p>\n<p>printf(&#8220;before f.a-&gt;s.\\n&#8221;);<br \/>\nif(f.a-&gt;s)<br \/>\n{<br \/>\nprintf(&#8220;before printf f.a-&gt;s.\\n&#8221;);<br \/>\nprintf(f.a-&gt;s);<br \/>\nprintf(&#8220;before printf f.a-&gt;s.\\n&#8221;);<br \/>\n}<\/p>\n<p>return EXIT_SUCCESS;<br \/>\n}<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<br \/>\n10<br \/>\n11<br \/>\n12<br \/>\n13<br \/>\n14<br \/>\n15<br \/>\n16<br \/>\n17<br \/>\n18<br \/>\n19<br \/>\n20<br \/>\n21<br \/>\n22<br \/>\n23<br \/>\n24<br \/>\n25<br \/>\n26<br \/>\n27<br \/>\n28<br \/>\n29<br \/>\n30<br \/>\n31<\/p>\n<p>\/\/ gdb_pzero_length_array.c<br \/>\n#include &lt;stdio.h&gt;<br \/>\n#include &lt;stdlib.h&gt;<\/p>\n<p>struct str<br \/>\n{<br \/>\nint len;<br \/>\nchar *s;<br \/>\n};<\/p>\n<p>struct foo<br \/>\n{<br \/>\nstruct str *a;<br \/>\n};<\/p>\n<p>int main(void)<br \/>\n{<br \/>\nstruct foo f = { NULL };<\/p>\n<p>printf(&#8220;sizeof(struct str) = %d\\n&#8221;, sizeof(struct str));<\/p>\n<p>printf(&#8220;before f.a-&gt;s.\\n&#8221;);<\/p>\n<p>if (f.a-&gt;s)<br \/>\n{<br \/>\nprintf(&#8220;before printf f.a-&gt;s.\\n&#8221;);<br \/>\nprintf(f.a-&gt;s);<br \/>\nprintf(&#8220;before printf f.a-&gt;s.\\n&#8221;);<br \/>\n}<\/p>\n<p>return EXIT_SUCCESS;<br \/>\n}<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<br \/>\n10<br \/>\n11<br \/>\n12<br \/>\n13<br \/>\n14<br \/>\n15<br \/>\n16<br \/>\n17<br \/>\n18<br \/>\n19<br \/>\n20<br \/>\n21<br \/>\n22<br \/>\n23<br \/>\n24<br \/>\n25<br \/>\n26<br \/>\n27<br \/>\n28<br \/>\n29<br \/>\n30<br \/>\n31<br \/>\n32<\/p>\n<p>\u53ef\u4ee5\u770b\u5230\u8fd9\u4e24\u4e2a\u7a0b\u5e8f\u867d\u7136\u90fd\u5b58\u5728\u8bbf\u95ee\u5f02\u5e38, \u4f46\u662f\u6bb5\u9519\u8bef\u7684\u4f4d\u7f6e\u5374\u4e0d\u540c<\/p>\n<p>\u6211\u4eec\u5c06\u4e24\u4e2a\u7a0b\u5e8f\u7f16\u8bd1\u6210\u6c47\u7f16, \u7136\u6237 diff \u67e5\u770b\u4ed6\u4eec\u7684\u6c47\u7f16\u4ee3\u7801\u6709\u4f55\u4e0d\u540c<\/p>\n<p>gcc -S gdb_zero_length_array.c -o gdb_test.s<br \/>\ngcc -S gdb_pzero_length_array.c -o gdb_ptest<br \/>\ndiff gdb_test.s gdb_ptest.s<\/p>\n<p>1c1<br \/>\n&lt; .file &#8220;gdb_zero_length_array.c&#8221;<br \/>\n&#8212;<br \/>\n&gt; .file &#8220;gdb_pzero_length_array.c&#8221;<br \/>\n23c23<br \/>\n&lt; movl $4, %esi<br \/>\n&#8212;<br \/>\n&gt; movl $16, %esi<br \/>\n30c30<br \/>\n&lt; addq $4, %rax<br \/>\n&#8212;<br \/>\n&gt; movq 8(%rax), %rax<br \/>\n36c36<br \/>\n&lt; addq $4, %rax<br \/>\n&#8212;<br \/>\n&gt; movq 8(%rax), %rax<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<br \/>\n10<br \/>\n11<br \/>\n12<br \/>\n13<br \/>\n14<br \/>\n15<br \/>\n16<br \/>\n17<br \/>\n18<br \/>\n19<br \/>\n20<br \/>\n# printf(&#8220;sizeof(struct str) = %d\\n&#8221;, sizeof(struct str));<br \/>\n23c23<br \/>\n&lt; movl $4, %esi #printf(&#8220;sizeof(struct str) = %d\\n&#8221;, sizeof(struct str));<br \/>\n&#8212;<br \/>\n&gt; movl $16, %esi #printf(&#8220;sizeof(struct str) = %d\\n&#8221;, sizeof(struct str));<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n\u4ece64\u4f4d\u7cfb\u7edf\u4e2d, \u6c47\u7f16\u6211\u4eec\u770b\u51fa, \u53d8\u957f\u6570\u7ec4\u7ed3\u6784\u7684\u5927\u5c0f\u4e3a4, \u800c\u6307\u9488\u5f62\u5f0f\u7684\u7ed3\u6784\u5927\u5c0f\u4e3a16<\/p>\n<p>f.a-&gt;s<br \/>\n30c30\/36c36<br \/>\n&lt; addq $4, %rax<br \/>\n&#8212;<br \/>\n&gt; movq 8(%rax), %rax<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n\u53ef\u4ee5\u770b\u5230\u6709<\/p>\n<p>\u5bf9\u4e8e char s[0] \u6765\u8bf4, \u6c47\u7f16\u4ee3\u7801\u7528\u4e86 addq \u6307\u4ee4, addq $4, %rax<\/p>\n<p>\u5bf9\u4e8e char*s \u6765\u8bf4\uff0c\u6c47\u7f16\u4ee3\u7801\u7528\u4e86 movq \u6307\u4ee4, movq 8(%rax), %rax<\/p>\n<p>addq \u5bf9 %rax + sizeof(struct str), \u5373str\u7ed3\u6784\u7684\u672b\u5c3e\u5373\u662fchar s[0]\u7684\u5730\u5740, \u8fd9\u4e00\u6b65\u53ea\u662f\u62ff\u5230\u4e86\u5176\u5730\u5740, \u800c movq \u5219\u662f\u628a\u5730\u5740\u91cc\u7684\u5185\u5bb9\u653e\u8fdb\u53bb, \u56e0\u6b64\u6709\u65f6\u4e5f\u88ab\u7ffb\u8bd1\u4e3aleap\u6307\u4ee4, \u53c2\u89c1\u4e0b\u4e00\u5217\u5b50<\/p>\n<p>\u4ece\u8fd9\u91cc\u53ef\u4ee5\u770b\u5230, \u8bbf\u95ee\u6210\u5458\u6570\u7ec4\u540d\u5176\u5b9e\u5f97\u5230\u7684\u662f\u6570\u7ec4\u7684\u76f8\u5bf9\u5730\u5740, \u800c\u8bbf\u95ee\u6210\u5458\u6307\u9488\u5176\u5b9e\u662f\u76f8\u5bf9\u5730\u5740\u91cc\u7684\u5185\u5bb9(\u8fd9\u548c\u8bbf\u95ee\u5176\u5b83\u975e\u6307\u9488\u6216\u6570\u7ec4\u7684\u53d8\u91cf\u662f\u4e00\u6837\u7684)<\/p>\n<p>\u8bbf\u95ee\u76f8\u5bf9\u5730\u5740\uff0c\u7a0b\u5e8f\u4e0d\u4f1acrash\uff0c\u4f46\u662f\uff0c\u8bbf\u95ee\u4e00\u4e2a\u975e\u6cd5\u7684\u5730\u5740\u4e2d\u7684\u5185\u5bb9\uff0c\u7a0b\u5e8f\u5c31\u4f1acrash\u3002<br \/>\n\u6709\u65f6\u5019<\/p>\n<p>\/\/ 4-1.c<br \/>\n#include &lt;stdio.h&gt;<br \/>\n#include &lt;stdlib.h&gt;<\/p>\n<p>int main(void)<br \/>\n{<\/p>\n<p>char *a;<br \/>\nprintf(&#8220;%p\\n&#8221;, a);<\/p>\n<p>return EXIT_SUCCESS;<br \/>\n}<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<br \/>\n10<br \/>\n11<br \/>\n12<br \/>\n4-2.c<br \/>\n#include &lt;stdio.h&gt;<br \/>\n#include &lt;stdlib.h&gt;<\/p>\n<p>int main(void)<br \/>\n{<\/p>\n<p>char a[0];<br \/>\nprintf(&#8220;%p\\n&#8221;, a);<\/p>\n<p>return EXIT_SUCCESS;<br \/>\n}<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<br \/>\n10<br \/>\n11<br \/>\n12<br \/>\n$ diff 4-1.s 4-2.s<br \/>\n1c1<br \/>\n&lt; .file &#8220;4-1.c&#8221;<br \/>\n&#8212;<br \/>\n&gt; .file &#8220;4-2.c&#8221;<br \/>\n13c13<br \/>\n&lt; subl $16, %esp<br \/>\n&#8212;<br \/>\n&gt; subl $32, %esp<br \/>\n15c15<br \/>\n&lt; leal 16(%esp), %eax<br \/>\n&#8212;<br \/>\n&gt; movl 28(%esp), %eax<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<br \/>\n10<br \/>\n11<br \/>\n12<br \/>\n13<br \/>\n\u5bf9\u4e8e char a[0] \u6765\u8bf4, \u6c47\u7f16\u4ee3\u7801\u7528\u4e86 leal \u6307\u4ee4, leal 16(%esp), %eax<\/p>\n<p>\u5bf9\u4e8e char *a \u6765\u8bf4\uff0c\u6c47\u7f16\u4ee3\u7801\u7528\u4e86 movl \u6307\u4ee4, movl 28(%esp), %eax<\/p>\n<p>4.2 \u5730\u5740\u4f18\u5316<br \/>\n\/\/ 5-1.c<br \/>\n#include &lt;stdio.h&gt;<br \/>\n#include &lt;stdlib.h&gt;<\/p>\n<p>int main(void)<br \/>\n{<\/p>\n<p>char a[0];<br \/>\nprintf(&#8220;%p\\n&#8221;, a);<\/p>\n<p>char b[0];<br \/>\nprintf(&#8220;%p\\n&#8221;, b);<\/p>\n<p>return EXIT_SUCCESS;<br \/>\n}<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<br \/>\n10<br \/>\n11<br \/>\n12<br \/>\n13<br \/>\n14<br \/>\n15<\/p>\n<p>\u7531\u4e8e0\u957f\u5ea6\u6570\u7ec4\u662f GNU C \u7684\u6269\u5c55, \u4e0d\u88ab\u6807\u51c6\u5e93\u4efb\u53ef, \u90a3\u4e48\u4e00\u4e9b\u5de7\u5999\u7f16\u5199\u7684\u8be1\u5f02\u4ee3\u7801, \u5176\u6267\u884c\u7ed3\u679c\u5c31\u662f\u4f9d\u8d56\u4e8e\u7f16\u8bd1\u5668\u548c\u4f18\u5316\u7b56\u7565\u7684\u5b9e\u73b0\u7684.<\/p>\n<p>\u6bd4\u5982\u4e0a\u9762\u7684\u4ee3\u7801, a\u548cb\u7684\u5730\u5740\u5c31\u4f1a\u88ab\u7f16\u8bd1\u5668\u4f18\u5316\u5230\u4e00\u5904, \u56e0\u4e3aa[0] \u548c b[0] \u5bf9\u4e8e\u7a0b\u5e8f\u6765\u8bf4\u662f\u65e0\u6cd5\u4f7f\u7528\u7684, \u8fd9\u8ba9\u6211\u4eec\u60f3\u5230\u4e86\u4ec0\u4e48?<\/p>\n<p>\u7f16\u8bd1\u5668\u5bf9\u4e8e\u76f8\u540c\u5b57\u7b26\u4e32\u5e38\u91cf, \u5f80\u5f80\u5730\u5740\u4e5f\u662f\u4f18\u5316\u5230\u4e00\u5904, \u51cf\u5c11\u7a7a\u95f4\u5360\u7528<\/p>\n<p>\/\/ 5-2.c<br \/>\n#include &lt;stdio.h&gt;<br \/>\n#include &lt;stdlib.h&gt;<\/p>\n<p>int main(void)<br \/>\n{<\/p>\n<p>const char *a = &#8220;Hello&#8221;;<br \/>\nprintf(&#8220;%p\\n&#8221;, a);<\/p>\n<p>const char *b = &#8220;Hello&#8221;;<br \/>\nprintf(&#8220;%p\\n&#8221;, b);<\/p>\n<p>const char c[] = &#8220;Hello&#8221;;<br \/>\nprintf(&#8220;%p\\n&#8221;, c);<\/p>\n<p>return EXIT_SUCCESS;<br \/>\n}<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<br \/>\n10<br \/>\n11<br \/>\n12<br \/>\n13<br \/>\n14<br \/>\n15<br \/>\n16<br \/>\n17<br \/>\n18<\/p>\n<p>\u53c2\u8003<br \/>\n\u7ed3\u6784\u4f53\u4e2d\u7684\u6307\u9488\u4e0e\u96f6\u957f\u5ea6\u6570\u7ec4<\/p>\n<p>\u96f6\u957f\u5ea6\u6570\u7ec4\u7684\u5999\u7528<\/p>\n<p>C\u8bed\u8a00\u4e2d\u957f\u5ea6\u4e3a0\u7684\u6570\u7ec4<\/p>\n<p>C\/C++ \u4e2d\u76840\u957f\u6570\u7ec4\uff08\u67d4\u6027\u6570\u7ec4\uff09<\/p>\n<p>GNU C\u4e2d\u7684\u96f6\u957f\u5ea6\u6570\u7ec4<\/p>\n<p>C\u8bed\u8a00\u53d8\u957f\u6570\u7ec4data[0]\u3010\u603b\u7ed3\u3011<\/p>\n<p>\u957f\u5ea6\u4e3a0\u7684\u6570\u7ec4\u2014\u2014C\u8bed\u8a00\u7684\u975e\u6807\u51c6\u7528\u6cd5\u4e4b\u4e00<\/p>\n<p>\u957f\u5ea6\u4e3a0\u7684\u6570\u7ec4\u7684size\u4e3a\u4ec0\u4e48\u4e0d\u4e00\u5b9a\u662f0\uff1f<\/p>\n<p>\u6709\u5173C\u8bed\u8a00\u5360\u4f4d\u7b26<\/p>\n<p>C\u8bed\u8a00\u6280\u5de7\u4e4b\u957f\u5ea6\u4e3a0\u7684\u6570\u7ec4<\/p>\n<p>\u96f6\u957f\u5ea6\u6570\u7ec4\u4f7f\u7528<\/p>\n<p>\u4f7f\u7528\u96f6\u957f\u5ea6\u6570\u7ec4<\/p>\n<p>\u96f6\u957f\u5ea6\u6570\u7ec4<\/p>\n<p>C\/C++ \u4e2d\u957f\u5ea6\u4e3a0\u7684\u6570\u7ec4<\/p>\n<p>GCC \u4e2d\u96f6\u957f\u6570\u7ec4\u4e0e\u53d8\u957f\u6570\u7ec4<\/p>\n<p>\u96f6\u957f\u5ea6\u6570\u7ec4\u7684\u5999\u7528<\/p>\n<p>Multiple 0-length arrays have the same address?<\/p>\n<p>\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014<br \/>\n\u7248\u6743\u58f0\u660e\uff1a\u672c\u6587\u4e3aCSDN\u535a\u4e3b\u300cCHENG Jian\u300d\u7684\u539f\u521b\u6587\u7ae0\uff0c\u9075\u5faaCC 4.0 BY-SA\u7248\u6743\u534f\u8bae\uff0c\u8f6c\u8f7d\u8bf7\u9644\u4e0a\u539f\u6587\u51fa\u5904\u94fe\u63a5\u53ca\u672c\u58f0\u660e\u3002<br \/>\n\u539f\u6587\u94fe\u63a5\uff1ahttps:\/\/blog.csdn.net\/gatieme\/article\/details\/64131322<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u539f\u6587\u5730\u5740 &nbsp; CHENG Ji<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[],"tags":[118],"class_list":["post-5298","post","type-post","status-publish","format-standard","hentry","tag-02-"],"_links":{"self":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/5298","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/comments?post=5298"}],"version-history":[{"count":0,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/5298\/revisions"}],"wp:attachment":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/media?parent=5298"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/categories?post=5298"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/tags?post=5298"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}