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次。最后一个字符串保留下来。