memcpy 擦除 C 中 char 数组中的变量
memcpy erase variables in char array in C
我创建多维数组并将其写入控制台
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
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;
}
memcpy覆盖了数组a的内容。为什么要这样做?
数组 b 仅分配了 10 个字节,因为 char b[][10]
表示 "allocate space for an array of 10-char strings, the number of strings being specified by the initializer." 在您的情况下,初始值设定项为“0”,即一个字符串。所以它为一个 10 个字符的字符串分配了 space。
因为整个都在栈上,所以布局是颠倒的。因此,b 的位置在前,然后是 a。
所以,当你写入 b 时,它会正确启动,写入第一个字符串。当你写入第二个字符串时,它会溢出到数组 a 的 space 中并将其杀死。 4次。最后一个字符串保留下来。
我创建多维数组并将其写入控制台
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
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;
}
memcpy覆盖了数组a的内容。为什么要这样做?
数组 b 仅分配了 10 个字节,因为 char b[][10]
表示 "allocate space for an array of 10-char strings, the number of strings being specified by the initializer." 在您的情况下,初始值设定项为“0”,即一个字符串。所以它为一个 10 个字符的字符串分配了 space。
因为整个都在栈上,所以布局是颠倒的。因此,b 的位置在前,然后是 a。
所以,当你写入 b 时,它会正确启动,写入第一个字符串。当你写入第二个字符串时,它会溢出到数组 a 的 space 中并将其杀死。 4次。最后一个字符串保留下来。