user-0 提问: (C 语言)问题的根源：将多个数组连成一个数组的快捷办法；

回复:
user: user-1
content: static char disp_on01[5] = { 0xDF,  0x55, 0xAA, 0x52,0x08,}; static char disp_on02[5] = { 0xDF,  0x55, 0xAA, 0x52,0x08,}; static char disp_on03[5] = { 0xDF,  0x55, 0xAA, 0x52,0x08,}; static char disp_on04[5] = { 0xDF,  0x55, 0xAA, 0x52,0x08,}; static char disp_on05[5] = { 0xDF,  0x55, 0xAA, 0x52,0x08,}; static unsigned char* param[] = { disp_on01,disp_on02,disp_on03,disp_on04,disp_on05,NULL， }; static int Sizes[]={    sizeof(disp_on01)/sizeof(disp_on01[0]),    sizeof(disp_on02)/sizeof(disp_on02[0]),    sizeof(disp_on03)/sizeof(disp_on03[0]),    sizeof(disp_on04)/sizeof(disp_on04[0]),    sizeof(disp_on05)/sizeof(disp_on05[0]), -1};  int getTotalSIze(){    int size=0;    while(Sizes[i]>0)size+=  Sizes[i];    return size; } int getSize(int n){    return Sizes[n]; }  马马虎虎用的话，可以采取这样的方式补救。 赵老师的方法，本来是可以用的，不过C，C++不是汇编语言。  数据未必会安排在一起，也未必就按照定义的顺序排列。 可能，某一次可以成功，甚至很多次都成功了。 突然有一次，就不行了。  早期的编译器，也许会按照数据排列的顺序，组织数据。 这样比较紧凑，占用内存比较小。 而且也没有多线程之说。  编译器，只能顺序扫描数据，比较自然的情况，就是数据也顺序安排。 中间可能插入一些间隔，用于对齐。  现在的编译器，受到的限制比较少，加上很多东西，不再标准之内，编译器可以随便安排。

user: user-2
content: 引用 19 楼 zhao4zhong1 的回复:“所有指南针对船的导航效果都是一致的” 可惜事实并非如此。 呵呵 不止对编程不在行  基础的物理常识都不具备吗  弱爆了

user: user-3
content: 引用 16 楼 lin5161678 的回复:[quote=引用 15 楼 zhao4zhong1 的回复:] 我只认VC6摆在我眼前的事实。（我驾船出海的话只带一个指南针） 你如果能用VC6举出反例，我才会服你。 不恰当的比喻   所有指南针对船的导航效果都是一致的  而 不同的编译器[指南针]对那段残次品代码的解析[对船只的导航] 却是不同的  狭小的眼界  自以为是的无知  你服不服 我无所谓  我打你的脸 只是不让你误导新人而已 [/quote] “所有指南针对船的导航效果都是一致的” 可惜事实并非如此。 1+1=2在现实世界中发生过哪怕一次吗？

user: user-3
content: 引用 17 楼 supermegaboy 的回复:[quote=引用 15 楼 zhao4zhong1 的回复:] 我只认VC6摆在我眼前的事实。（我驾船出海的话只带一个指南针） 你如果能用VC6举出反例，我才会服你。  唉，你不说话，没人知道你是哑巴。[/quote]

user: user-3
content: #define N1 extend_cmd_enable #define N2    display_setting #define N3 wave_cycle_setting #define N4        gip_setting #define N5      power_setting #define N6       vcom_setting #define N7     pannel_setting #define N8      gamma_setting #define N9       mipi_setting static unsigned char N1[ 4]={0xB9,0xFF,0x83,0x69}; static unsigned char N2[16]={0xB2,0x00,0x23,0x62,0x62,0x70,0x00,0xFF,0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x01}; static unsigned char N3[ 6]={0xB4,0x00,0x1D,0x5F,0x0E,0x06}; static unsigned char N4[27]={0xD5,0x00,0x04,0x03,0x00,0x01,0x05,0x1C,0x70,0x01,0x03,0x00,0x00,0x40,0x06,0x51,0x07,0x00,0x00,0x41,0x06,0x50,0x07,0x07,0x0F,0x04,0x00}; static unsigned char N5[20]={0xB1,0x01,0x00,0x34,0x06,0x00,0x0F,0x0F,0x2A,0x32,0x3F,0x3F,0x07,0x3A,0x01,0xE6,0xE6,0xE6,0xE6,0xE6}; static unsigned char N6[ 3]={0xB6,0x56,0x56}; static unsigned char N7[ 2]={0xCC,0x02}; static unsigned char N8[35]={0xE0,0x00,0x1D,0x22,0x38,0x3D,0x3F,0x2E,0x4A,0x06,0x0D,0x0F,0x13,0x15,0x13,0x16,0x10,0x19,0x00,0x1D,0x22,0x38,0x3D,0x3F,0x2E,0x4A,0x06,0x0D,0x0F,0x13,0x15,0x13,0x16,0x10,0x19}; static unsigned char N9[14]={0xBA,0x00,0xA0,0xC6,0x00,0x0A,0x00,0x10,0x30,0x6F,0x02,0x11,0x18,0x40}; static struct param_dev global_param[]={     {sizeof(N1),N1},     {sizeof(N2),N2},     {sizeof(N3),N3},     {sizeof(N4),N4},     {sizeof(N5),N5},     {sizeof(N6),N6},     {sizeof(N7),N7},     {sizeof(N8),N8},     {sizeof(N9),N9}, };

user: user-0
content: 谢谢大家的回复， 问题在不久前，在与朋友的讨论中用数据结构的方法解决了，大致的思路为：既然我不能用指针数组来得到保存在里面的每个数组的长度，那么我就用一个简单的数据结构，来保存每个数组的首地址和每个数组的长度；然后再定这么一个数据结构的数组，然后一个循环遍历这个数组，就ok了，如果要添加普通数组时，直接上这个数据结构中添加一个元素就ok了， 而不能再更改处理代码的那个片段了。  #include<stdio.h> #include<stdlib.h>  #define GLOBAL_LEN		200 struct param_dev { 	int size; /* the param size */ 	unsigned char *param; /* store the param */ };  static unsigned char extend_cmd_enable[4] = {0xB9, 0xFF, 0x83, 0x69}; static unsigned char display_setting[16] = { 	0xB2, 0x00, 0x23, 0x62, 	0x62, 0x70, 0x00, 0xFF, 	0x00, 0x00, 0x00, 0x00, 	0x03, 0x03, 0x00, 0x01, }; static unsigned char wave_cycle_setting[6] = {0xB4, 0x00, 0x1D, 0x5F, 0x0E, 0x06}; static unsigned char gip_setting[27] = { 	0xD5, 0x00, 0x04, 0x03, 	0x00, 0x01, 0x05, 0x1C, 	0x70, 0x01, 0x03, 0x00, 	0x00, 0x40, 0x06, 0x51, 	0x07, 0x00, 0x00, 0x41, 	0x06, 0x50, 0x07, 0x07, 	0x0F, 0x04, 0x00, }; static unsigned char power_setting[20] = { 	0xB1, 0x01, 0x00, 0x34, 	0x06, 0x00, 0x0F, 0x0F, 	0x2A, 0x32, 0x3F, 0x3F, 	0x07, 0x3A, 0x01, 0xE6, 	0xE6, 0xE6, 0xE6, 0xE6, }; static unsigned char vcom_setting[3] = {0xB6, 0x56, 0x56}; static unsigned char pannel_setting[2] = {0xCC, 0x02}; static unsigned char gamma_setting[35] = { 	0xE0, 0x00, 0x1D, 0x22, 	0x38, 0x3D, 0x3F, 0x2E, 	0x4A, 0x06, 0x0D, 0x0F, 	0x13, 0x15, 0x13, 0x16, 	0x10, 0x19, 0x00, 0x1D, 	0x22, 0x38, 0x3D, 0x3F, 	0x2E, 0x4A, 0x06, 0x0D, 	0x0F, 0x13, 0x15, 0x13, 	0x16, 0x10, 0x19, }; static unsigned char mipi_setting[14] = { 	0xBA, 0x00, 0xA0, 0xC6, 	0x00, 0x0A, 0x00, 0x10, 	0x30, 0x6F, 0x02, 0x11, 	0x18, 0x40, };  static struct param_dev global_param[] ={ 	{ sizeof(extend_cmd_enable),  extend_cmd_enable }, 	{ sizeof(display_setting),       display_setting}, 	{ sizeof(wave_cycle_setting), wave_cycle_setting }, 	{ sizeof(gip_setting),              gip_setting }, 	{ sizeof(power_setting),          power_setting }, 	{ sizeof(vcom_setting),            vcom_setting }, 	{ sizeof(pannel_setting),        pannel_setting }, 	{ sizeof(gamma_setting),          gamma_setting }, 	{ sizeof(mipi_setting),            mipi_setting }, };  static unsigned char *param_put(struct param_dev *param, int cnt) { 	int i, j, current = 0; 	struct param_dev *parp = NULL; 	unsigned char temp[GLOBAL_LEN] = { 0 };  	parp = param; 	for (i = 0; i < cnt; i++) { 		for (j = 0; j < (parp + i)->size; j++) { 			temp[current++] = (parp + i)->param[j]; 		}	 	} 	 	printf("clw: %d\n", current);  	for (i = 0; i < current; i++) 	{ 		printf("0x%02x,", temp[i]); 	} 	return temp; }  static struct param_dev *param_get(struct param_dev *dst, int lenth, unsigned char *src) { 	int i, j, current = 0; 	struct param_dev *parp;  	parp = dst; 	for (j = 0; j < lenth; j++) { 		for (i = 0; i < dst->size; i++) { 			dst->param[i] = *src++; 		} 		dst++; 	}  	return parp; }  int main() { 	int lenth = 0; 	struct param_dev *parp = NULL; 	unsigned char *src;  	printf("First time put param: \n");  	src = param_put( global_param, sizeof(global_param) );  	printf("\n"); 	 //	parp = param_get( global_param, sizeof(global_param), src);  //	printf("Second time put param: \n");  //	param_put( parp, sizeof(global_param) ); 	 //	printf("\n"); }

user: user-0
content: 引用 4 楼 supermegaboy 的回复:对了，是否需要按声明顺序排列？ 我的需求很简单，不过要针对于多数据模式，既有上百个不同变量名称的数组， 每个数组中的个数不尽相同，顺序可以不同， 但是我连接成一个数组的时候，还得把原来每个数组的大小保存下来，这个差不多就是我的需求了。 目前这个问题我已经解决了哈，稍后我附上个人的想法与解决方案。

user: user-0
content: 引用 2 楼 max_min_ 的回复:可以用memcpy函数进行一个数组一个数组的拷贝的！ 注意地址移动就好了！ 这种方法跟我一个一个的赋值没有多大区别啊，假如我有几百个不同变量名称的数组，那我不是要调用几百遍memcpy呢？ 所以还是不能达到快捷的连接目的。

user: user-3
content: 引用 12 楼 lin5161678 的回复:[quote=引用 10 楼 zhao4zhong1 的回复:] 难者不会，会者不难： #pragma warning(disable:4305 4309) #include <stdio.h> #include <stdlib.h> #include <string.h> static char disp_on01[5] = { 0xDF,  0x55, 0xAA, 0x51,0x08,}; static char disp_on02[5] = { 0xDF,  0x55, 0xAA, 0x52,0x08,}; static char disp_on03[5] = { 0xDF,  0x55, 0xAA, 0x53,0x08,}; static char disp_on04[5] = { 0xDF,  0x55, 0xAA, 0x54,0x08,}; static unsigned char* param; void test(int n) {     int i,g;      param=(unsigned char*)malloc(n*5);     if (NULL==param) exit(1);     g=(unsigned int)disp_on02-(unsigned int)disp_on01;     for (i=0;i<n;i++) {         memcpy(param+i*5,disp_on01+i*g,5);     }     for (i=0;i<n*5;i++) printf("%02X ",param[i]);     printf("\n");     free(param); } int main() {     test(3);     test(4);     return 0; } //DF 55 AA 51 08 DF 55 AA 52 08 DF 55 AA 53 08 //DF 55 AA 51 08 DF 55 AA 52 08 DF 55 AA 53 08 DF 55 AA 54 08 //  你就是属于不会的  变量的声明顺序 和 变量的分配顺序 无关  你其他通过disp_on01+偏移访问其他数组  做法不可靠 不要误导新手好嘛  2条链接 你看一下 http://codepad.org/kR5xoN68 http://ideone.com/qZE2hq[/quote] 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？

user: user-4
content: 引用 15 楼 zhao4zhong1 的回复:我只认VC6摆在我眼前的事实。（我驾船出海的话只带一个指南针） 你如果能用VC6举出反例，我才会服你。  唉，你不说话，没人知道你是哑巴。

user: user-2
content: 引用 15 楼 zhao4zhong1 的回复:我只认VC6摆在我眼前的事实。（我驾船出海的话只带一个指南针） 你如果能用VC6举出反例，我才会服你。 不恰当的比喻   所有指南针对船的导航效果都是一致的  而 不同的编译器[指南针]对那段残次品代码的解析[对船只的导航] 却是不同的  狭小的眼界  自以为是的无知  你服不服 我无所谓  我打你的脸 只是不让你误导新人而已

user: user-2
content: 引用 10 楼 zhao4zhong1 的回复:难者不会，会者不难： #pragma warning(disable:4305 4309) #include <stdio.h> #include <stdlib.h> #include <string.h> static char disp_on01[5] = { 0xDF,  0x55, 0xAA, 0x51,0x08,}; static char disp_on02[5] = { 0xDF,  0x55, 0xAA, 0x52,0x08,}; static char disp_on03[5] = { 0xDF,  0x55, 0xAA, 0x53,0x08,}; static char disp_on04[5] = { 0xDF,  0x55, 0xAA, 0x54,0x08,}; static unsigned char* param; void test(int n) {     int i,g;      param=(unsigned char*)malloc(n*5);     if (NULL==param) exit(1);     g=(unsigned int)disp_on02-(unsigned int)disp_on01;     for (i=0;i<n;i++) {         memcpy(param+i*5,disp_on01+i*g,5);     }     for (i=0;i<n*5;i++) printf("%02X ",param[i]);     printf("\n");     free(param); } int main() {     test(3);     test(4);     return 0; } //DF 55 AA 51 08 DF 55 AA 52 08 DF 55 AA 53 08 //DF 55 AA 51 08 DF 55 AA 52 08 DF 55 AA 53 08 DF 55 AA 54 08 //  你就是属于不会的  变量的声明顺序 和 变量的分配顺序 无关  你其他通过disp_on01+偏移访问其他数组  做法不可靠 不要误导新手好嘛  2条链接 你看一下 http://codepad.org/kR5xoN68 http://ideone.com/qZE2hq

user: user-3
content: 我只认VC6摆在我眼前的事实。（我驾船出海的话只带一个指南针） 你如果能用VC6举出反例，我才会服你。

user: user-5
content: 扩展一个动态数组，，，然后往后加，，

user: user-2
content: 引用 13 楼 zhao4zhong1 的回复:任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！ 摆在眼前的事实就是 一个运行结果是  http://ideone.com/qZE2hq DF 55 AA 51 08 DF 55 AA 52 08 00 00 00 00 00  DF 55 AA 51 08 DF 55 AA 52 08 00 00 00 00 00 69 B7 00 00 00  一个运行结果是 http://codepad.org/kR5xoN68 DF 55 AA 51 08 DF 55 AA 52 08 00 70 97 04 08  DF 55 AA 51 08 DF 55 AA 52 08 00 70 97 04 08 00 00 00 00 00   你的做法是错的  并且还在误导新人

user: user-3
content: 难者不会，会者不难： #pragma warning(disable:4305 4309) #include <stdio.h> #include <stdlib.h> #include <string.h> static char disp_on01[5] = { 0xDF,  0x55, 0xAA, 0x51,0x08,}; static char disp_on02[5] = { 0xDF,  0x55, 0xAA, 0x52,0x08,}; static char disp_on03[5] = { 0xDF,  0x55, 0xAA, 0x53,0x08,}; static char disp_on04[5] = { 0xDF,  0x55, 0xAA, 0x54,0x08,}; static unsigned char* param; void test(int n) {     int i,g;      param=(unsigned char*)malloc(n*5);     if (NULL==param) exit(1);     g=(unsigned int)disp_on02-(unsigned int)disp_on01;     for (i=0;i<n;i++) {         memcpy(param+i*5,disp_on01+i*g,5);     }     for (i=0;i<n*5;i++) printf("%02X ",param[i]);     printf("\n");     free(param); } int main() {     test(3);     test(4);     return 0; } //DF 55 AA 51 08 DF 55 AA 52 08 DF 55 AA 53 08 //DF 55 AA 51 08 DF 55 AA 52 08 DF 55 AA 53 08 DF 55 AA 54 08 //

user: user-6
content: 指针数组 不能 将多个数组连成一个数组

user: user-2
content: 引用 7 楼 u011779875 的回复:用strcat啊 定义一个超级长的数组  之后就就一直连接字符串到最长的呗不能用 strcat 参数需要字符串 就是\0结尾 这里显然没满足这个条件

user: user-7
content: 用strcat啊 定义一个超级长的数组  之后就就一直连接字符串到最长的呗

user: user-2
content: 数组长度 自己维护