我创建了多维数组并将其写入控制台
char a[5][10];
strcpy(a[0], "111111");
strcpy(a[1], "211112");
strcpy(a[2], "311113");
strcpy(a[3], "411114");
strcpy(a[4], "511115");
printf("size : %d \n", sizeof(a));
int i;
for(i = 0; i < 5; i++)
{
printf("%d : %s \n",i,a[i]);
}
结果是
size : 50
0 : 111111
1 : 211112
2 : 311113
3 : 411114
4 : 511115
然后我将数组复制到另一个数组,并将它们写入控制台
char a[5][10];
char b[][10]={"0"};
strcpy(a[0], "111111");
strcpy(a[1], "211112");
strcpy(a[2], "311113");
strcpy(a[3], "411114");
strcpy(a[4], "511115");
memcpy(&b,&a,sizeof(a));
printf("sizeof(a) : %d \n", sizeof(a));
int i;
for(i = 0; i < 5; i++)
{
printf("%d : %s \n",i,a[i]);
}
printf("sizeof(b) : %d \n", sizeof(b));
for(i = 0; i < 5; i++)
{
printf("%d : %s \n",i,b[i]);
}
结果是:
sizeof(a) : 50
0 :
1 :
2 :
3 :
4 : 511115
sizeof(b) : 10
0 : 111111
1 : 211112
2 : 311113
3 : 411114
4 : 511115
数组中发生了什么变量?为什么数组的内容是空的?
我使用Ubuntu 14.04
,gcc版本为(Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4
答案 0 :(得分:4)
b
的大小太小,无法存储a
的所有内容,因此您访问了已分配的内存,这非常危险。
分配足够的内存。
char a[5][10];
char b[5][10]={{"0"}}; /* change this line */
strcpy(a[0], "111111");
strcpy(a[1], "211112");
strcpy(a[2], "311113");
strcpy(a[3], "411114");
strcpy(a[4], "511115");
memcpy(&b,&a,sizeof(a));
printf("sizeof(a) : %d \n", (int)sizeof(a)); /* change this line to pass data having correct type */
int i;
for(i = 0; i < 5; i++)
{
printf("%d : %s \n",i,a[i]);
}
printf("sizeof(b) : %d \n", (int)sizeof(b)); /* change this line to pass data having correct value */
for(i = 0; i < 5; i++)
{
printf("%d : %s \n",i,b[i]);
}
此代码可能会显示为什么a
中的内容似乎已删除:0x00写入a[i][0]
,printf()
将其解释为字符串结尾。
#include <stdio.h>
int main(void) {
char a[5][10];
char b[][10]={"0"};
strcpy(a[0], "111111");
strcpy(a[1], "211112");
strcpy(a[2], "311113");
strcpy(a[3], "411114");
strcpy(a[4], "511115");
memcpy(&b,&a,sizeof(a));
int i, j;
for (i = 0; i < 5; i++)
{
for (j = 0; j < 10; j++) printf("%02X ", (unsigned int)(unsigned char)a[i][j]);
putchar('\n');
}
return 0;
}
答案 1 :(得分:0)
memcpy覆盖了数组a的内容。为什么这样做?
数组b只分配了10个字节,因为char b[][10]
表示&#34;为10-char字符串数组分配空间,字符串数由初始化程序指定。&#34;在您的情况下,初始化程序是&#34; 0&#34;,即一个字符串。所以它为一个10-char字符串分配空间。
由于整个事物都在堆栈上,因此布局相反。因此,b的位置首先出现,然后是a。
因此,当你写入b时,它会正确启动,写入第一个字符串。当你写第二个字符串时,它会溢出到数组的空间并杀死它。 4次。最后一个字符串幸存下来。