Сомнения в концепции динамического выделения памяти и указателей

#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 битов удаляются для использования динамической памяти.