Memcpy стереть переменные в массиве символов в 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

2 ответа

Решение

Размер 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;
}

Me mcpy переписал содержимое массива a. Почему он это сделал?

Массив b был выделен только 10 байтов, потому что char b[][10] означает "выделить место для массива из 10-символьных строк, количество строк определяется инициализатором". В вашем случае инициализатор равен "0", то есть одна строка. Таким образом, он выделил место для одной строки из 10 символов.

Поскольку все это находится в стеке, макет полностью изменен. Таким образом, сначала находится местоположение b, а затем a.

Итак, когда вы пишете в b, он запускается правильно, пишет первую строку. Когда вы пишете вторую строку, она переполняется в пространстве массива а и убивает ее. 4 раза. Последняя строка выживает.

Другие вопросы по тегам