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 раза. Последняя строка выживает.