2016-02-24 6 views
-1

создать мульти массив dimensioanl и написать его утешатьтетсру удалить переменные в массив символов в 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

+0

Даже не следует запускать. Вы получаете доступ к неинициализированной памяти. – Leandros

+1

В тот момент, когда вы пишете 50 байт из 'a' в 10-байтовый буфер' b', все ставки отключены. – mah

+0

Какую длину, по вашему мнению, имеет внешний размер 'b'? Чего вы ожидаете? И почему? – Olaf

ответ

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; 
} 
+0

Было бы неплохо всегда указывать, что это вызывает _undefined behaviour_. Это не просто «очень опасно», но вы полностью вне дорог. – Olaf

0

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

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

Поскольку все это в стеке, макет обратный. Таким образом, первое место занимает b, а затем a.

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

+2

«Так как все дело в стеке, макет меняется на противоположный». Нет, этого не должно быть. В этом случае 'a' просто произошло после' b'. – MikeCAT

+2

Язык C не требует подбора стека. На этом уровне нет необходимости в деталях, которые могут меняться в зависимости от следующей версии компилятора, некоторых рандомизированных эвристик, добавленного кода и т. Д. Для типичной реализации компоновка стека может сильно варьироваться, например. при повторном использовании выделенного пространства в стеке. – Olaf

+0

Да, согласитесь по обоим пунктам, технически. Просто пытаясь помочь помощнику, они спрашивают, почему массив 'a' был поврежден. В данной версии gcc и данной ОС я думаю, что то, что я дал, было справедливым объяснением. – user3392439

 Смежные вопросы

  • Нет связанных вопросов^_^