首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

【急问◎】全局数组的赋值有关问题

2012-03-15 
【急问◎在线等】全局数组的赋值问题在一个c文件中获取一个动态长度的char型全局数组externA[]{0x01,0x02,0x

【急问◎在线等】全局数组的赋值问题
在一个c文件中获取一个动态长度的char型全局数组   externA[]={0x01,0x02,0x03}
在另一个c文件中赋值给动态长度的char型数组   dstB[]={0xff,0xff,0xff}
预期得到的结果为   desB[]={0xff,0xff,0xff,0x01,0x02,0x03}

如何实现?
为什么我用memcpy(&dstB[3],externA,strlen(externA)*sizeof(char));
得到的结果不正确?




[解决办法]
dstB的初值{0xff,0xff,0xff}决定了它的长度为3,它不是什么动态的。你给它赋6个值越界了。
[解决办法]
这样就是变长数组啊?
应该不行的,在定义时数组大小就已经固定了
看看c99关于变长数组的说明
[解决办法]
char externA[]={0xff,0xff,0xff,0x01,0x02,0x03};
char *dstB;
dstB = (char *)malloc(10);
memcpy(dstB, externA, strlen(externA) * sizeof(char) );

这样呢?
[解决办法]
memcpy(&dstB[3],externA,strlen(externA)*sizeof(char));

这dstB是定长的啊,怎么可能能放得下后来的externA呢?

dstB[]={0xff,0xff,0xff}这句就已经定义了dstB的大小是3

要想让它是动态的,

最好用new来做

例如

int n;
printf( "请输入dstB的大小: ");
scanf( "%d ",&n);
char *dstB=new char[n];

这样dstB指向的这个数组才是动态长度,

长度由你输入的n来决定
[解决办法]
总之喽,通过初始化数组来确定数组大小的,数组大小跟显示指定大小是一样的

如果再响数组添加元素的话,那越界是必然的了

至于解决办法狠简单,显示指定稍微大一点,或者动态分配内存

[解决办法]
memcpy(&dstB[3],externA,strlen(externA)*sizeof(char));

这dstB是定长的啊,怎么可能能放得下后来的externA呢?

dstB[]={0xff,0xff,0xff}这句就已经定义了dstB的大小是3

要想让它是动态的,

最好用new来做

例如

int n;
printf( "请输入dstB的大小: ");
scanf( "%d ",&n);
char *dstB=new char[n];

这样dstB指向的这个数组才是动态长度,

长度由你输入的n来决定
==============================
看了
[解决办法]
你应该在定义数组时分配足够(合适)的空间大小;
或者像“bargio_susie(平和 自制 审慎) ”说得那样用malloc动态申请足够的空间。

看这样是否满足你的要求:

char externA[]={0x01,0x02,0x03};

void main()
{
char dstB[32] = {0xff,0xff,0xff};

memcpy(dstB + 3, externA, sizeof(externA));

//以下打印数组dstB中的前6个数值
printf( "dstB[] = { ");
for (int nIndex = 0; nIndex < 6; ++nIndex)
{
printf( "%d, ", (int)dstB[nIndex]);
}
printf( "\b\b}\n ");
}

输出结果:
dstB[] = {-1, -1, -1, 1, 2, 3}

因为你是用char型数组存储int型数,所以打印的时候应该转换成int型,否则系统会把数组中的数当作某个字符的ASCII码,而打印出的字符并不是你想看到的数组中的数。
[解决办法]
数组长度是用sizeof好不好,不要用strlen
[解决办法]
memcpy(&dstB[3],externA,strlen(externA)*sizeof(char));

因为 strlen(externA) 没有得到真实数组长度
[解决办法]
使用你原来的方法,
两个前提:
1 dstB数组有足够的空间
2 externA[]={0x01,0x02,0x03,0x00}; //增加一个 0x00, strlen就可以获得正确长度了

热点排行