memcpy擦除C中char数组中的变量

时间:2016-02-24 12:23:38

标签: c multidimensional-array memcpy

我创建了多维数组并将其写入控制台

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

2 个答案:

答案 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次。最后一个字符串幸存下来。