Размер не увеличивается, но он хранит большие данные.Как это возможно? - PullRequest
0 голосов
/ 31 января 2019

Я пытался этот код в gcc6.3:

char a[2];
char b[]="Aditya";
strcpy(a,b);
printf("%s %lu\n",a,sizeof(a));

вывод был:

aditya@aditya-Gateway-series:~/luc$ ./a
Aditya 2 

Как переменная может быть еще 2 байта большой и хранить информацию 7 байтов?

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Как сказал Сурав Гхош, использование вами strcpy неверно и вызывает неопределенное поведение.Я думаю, что a имеет размер 2, b имеет размер 7, и они оказываются рядом друг с другом в памяти, что приводит к 9 байтам непрерывной выделенной памяти.Таким образом, после копирования a по-прежнему имеет размер 2 и содержит "Ad" - однако при печати в нем отображается вся строка, поскольку печать продолжается до первого символа конца строки.Если вы напечатаете b, я думаю, вы получите "itya", поскольку его адрес расположен в 2 байтах рядом с a.Надеюсь, это достаточно ясно и помогает!

0 голосов
/ 31 января 2019

a содержит только {'A', 'd'} - остальные символы записываются в память после a.В вашем случае вы не переписали ничего важного, поэтому код, кажется, функционирует должным образом.

Появляется в.Порядок записи после конца массива равен undefined , что означает, что компилятору или среде выполнения не требуется обрабатывать ситуацию каким-либо конкретным способом.C не требует проверки границ при доступе к массиву - он не выдаст исключение, если вы запишете после конца массива.Ваш код может немедленно завершиться сбоем, вы можете оказаться с поврежденными данными, может оставить вашу программу в плохом состоянии, так что она может произойти сбой позже (эти ситуациизабавно отлаживать, позвольте мне рассказать вам), или это может работать без видимых проблем.

Вы, программист, должны убедиться, что целевой массив достаточно велик, чтобы содержать новое значение.Здесь язык вас совсем не защищает.

0 голосов
/ 31 января 2019

В вашем коде:

strcpy(a,b);

вызывает неопределенное поведение , когда вы пытаетесь получить доступ к недопустимой памяти.Не полагайтесь на результат.

Для уточнения, a имеет только память для хранения двух char с, если вы попытаетесь написать (здесь, чтобы скопировать) больше, чем строка с одним символом (с нулевым терминатором), вы переполните выделенную память, тем самым рискуя оказаться в недопустимом месте в памяти.

Исходный буфер strcpy(), b содержит больше содержимого, которое может поместиться в буфер назначенияa, таким образом, операция включает в себя переполнение границы.Задача программиста - обеспечить, чтобы в буфере назначения было достаточно памяти.


Тем не менее, что касается расчета размера - позвольте мне добавить, размер массива, как только он будет определен, изменить нельзя.Вы можете заполнить содержимое и оставить его унифицированным / неиспользованным, но размеры массивов после определения не могут быть изменены.

...