#c #pointers #dynamic-memory-allocation #c-strings #string-literals
#c #указатели #динамическое выделение памяти #c-строки #строковые литералы
Вопрос:
Во-первых, это новая концепция для меня!! Я недавно изучал указатели и динамические выделения памяти и недавно выполнил какую-то программу, и мне было интересно, в операторе char * p=»Компьютеры» строка хранится в некоторой ячейке памяти, а базовый адрес, т.Е. начальный адрес строки, хранится в p, теперь я заметил, что могу выполнять любые желаемые операциичто касается строки, то теперь я сомневаюсь в том, почему мы используем специальный оператор, такой как malloc и calloc, когда мы можем просто объявить такую строку желаемой длины.
Если мое понимание концепции неверно, пожалуйста, объясните.
Заранее спасибо.
Ответ №1:
В этом объявлении
char*p="Computers";
указатель p
инициализируется адресом первого символа строкового литерала "Computers"
.
Строковые литералы имеют статическую продолжительность хранения. Вы не можете изменять строковый литерал, например
p[0] = 'c';
Любая попытка изменить строковый литерал приводит к неопределенному поведению.
Функция malloc
используется для динамического выделения памяти. Например, если вы хотите динамически создать массив символов, который будет содержать строку "Computers"
, которую вы должны написать
char *p = malloc( 10 ); // the same as `malloc( 10 * sizeof( char ) )`
strcpy( p, "Computers" );
Вы можете изменить созданный массив символов. Например
p[0] = 'c';
После того, как массив больше не требуется, вы должны освободить выделенную память, например
free( p );
В противном случае программа может иметь утечку памяти.
Комментарии:
1. В этом коде я выделил только один байт памяти для для как получается, что он принимает весь sting, а также я могу выполнять операции, пожалуйста, объясните. #включить<stdio.h> #включить<stdlib.h> int main() { char*a; a=malloc(1*sizeof(char)); scanf(«%s»,a); a[3]=’V’; printf(«%s», a); }
2. @Vineeth Представленный код имеет неопределенное поведение.
Ответ №2:
Простым ответом на это было бы, если бы char *p = "Computers";
вы в основном объявляли фиксированную постоянную строку. Это означает, что вы не можете редактировать что-либо внутри строки. Попытка сделать это может привести к ошибке сегментации. Использование malloc и calloc позволило бы нам редактировать строку.
Просто сделайте это p[0] = 'c'
, и вы увидите результат
Ответ №3:
Утверждение, подобное
char *p = "Computers";
не является примером динамического выделения памяти. Память для строкового литерала выделяется при запуске программы и удерживается до завершения программы. Вы не можете изменить размер этой памяти, и вы не должны ее изменять (поведение при этом не определено — оно может работать так, как ожидалось, может произойти сбой, оно может сделать что-нибудь промежуточное).
Мы используем malloc
, calloc
, и realloc
для выделения памяти во время выполнения, которая должна быть доступна для записи, изменять размер и не исчезать, пока мы явно не освободим ее.
Мы должны использовать указатели для ссылки на динамически выделяемую память, потому что именно так устроен язык, но указатели играют гораздо большую роль в программировании на C, чем просто отслеживание динамической памяти.
Ответ №4:
будучи новичком, я описал ниже свое собственное мышление…
Динамическая память полностью зависит от указателя. Я имею в виду, что без знания указателя вы можете справиться с динамическим выделением памяти. (stdlib) библиотечная функция, в которой хранятся calloc
, malloc
, relalloc
и free
.
malloc
инициализированный бит не упоминается, calloc
в основном используется для массива. realloc
используется для увеличения или уменьшения размера.
Просто сказать, что это не так сложно, как вы сначала думаете. если вы объявляете array[500]
начальное объявление, но вы использовали 100, а остальные 400 битов удаляются для использования динамической памяти.