Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 1
Регистрация: 13.11.2014
Сообщений: 31

Как работает strcpy с точки зрения распределения памяти?

06.03.2015, 15:15. Показов 2782. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые знатоки С++, объясните, пожалуйста, как работает strcpy с точки зрения распределения памяти?
Ламерский вопрос, но все-таки хочется понять, как правильно поступать в таких случаях:

Вариант1 - strcpy не работает - сообщение:
Необработанное исключение в "0x0f7ab6ad (msvcr100d.dll)" в "C_STRING_MEMORY.exe": 0xC0000005: Нарушение прав доступа при записи "0x000000013ffb6888"

Ну и что, что строка string1 инициализирована значением "aaa"? По-моему, строка должна быть переписана значением "privet".
C++
1
2
3
4
5
6
7
8
9
10
#include "stdafx.h"
#include <string>
 
int _tmain(int argc, _TCHAR* argv[])
{ char* string1;
  string1 = "aaa";
  strcpy (string1, "privet");
  //printf ("%s \n", *string1);
    return 0;
}
Вариант2 - strcpy не работает - то же сообщение, выделил же память?!:
C++
1
2
3
4
5
6
7
8
9
10
11
#include "stdafx.h"
#include <string>
 
int _tmain(int argc, _TCHAR* argv[])
{ char* string1;
  string1 = new char [100];
  string1 = "aaa";
  strcpy (string1, "privet");
  //printf ("%s \n", *string1);
    return 0;
}
Вариант3 - strcpy правильно работает, потому, что не было инициализации строки, а почему работает - не понятно!
C++
1
2
3
4
5
6
7
8
9
10
#include "stdafx.h"
#include <string>
 
int _tmain(int argc, _TCHAR* argv[])
{ char* string1;
  string1 = new char [100];
  strcpy (string1, "privet");
  //printf ("%s \n", *string1);
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.03.2015, 15:15
Ответы с готовыми решениями:

Как работает strcpy(), где ошибка
Всем привет) Писал задачу, которая из 10 строк выводит самое короткое и первое в алфавитном порядке. Не понимаю почему не работает...

Как в Java с точки зрения эффективности время процессора, памяти и простоты реализовать перевод
Возможно для вас это слишком просто или элементарно, но для моей задачи очень важно знать наилучший по памяти и по времени способ перевода...

Если два метода выполняют одно и то же - с точки зрения программы, но разное - с точки зрения логики?
void killCh(BCell cKiller, BCell cVictim){ cVictim.setChessman(cKiller.getChessman()); cKiller.setChessman(null); ...

8
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.03.2015, 15:21
Лучший ответ Сообщение было отмечено STW как решение

Решение

strcpy копирует строку в заранее выделенную область памяти.
string1 = "aaa"; <--- этой строкой ты присваиваешь новый указатель переменной string1, в который писать нельзя.
1
0 / 0 / 1
Регистрация: 13.11.2014
Сообщений: 31
06.03.2015, 15:33  [ТС]
Спасибо! А как же тогда поступить, если нужно строку инициализировать, а потом, при некотором условии, скопировать в нее некое значение?

А как в смысле распределения памяти ведет себя
memcpy (string1, "as1", 3);
Тоже, как и strcpy, копирует строку в заранее выделенную область памяти или сама выделяет память?
Чем, вообще, лучше пользоваться для копирования строк?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.03.2015, 15:40
Цитата Сообщение от STW Посмотреть сообщение
А как же тогда поступить, если нужно строку инициализировать, а потом, при некотором условии, скопировать в нее некое значение?
C++
1
2
3
char str[100] = "abcdefg";
...
strcpy( str, "New string" );
или
C++
1
2
3
4
char * str = new char [100];
strcpy( str, "Abc" ); // инициализировали
...
strcpy( str, "New string" );
Цитата Сообщение от STW Посмотреть сообщение
А как в смысле распределения памяти ведет себя
Никак. Они не выделяют память.

Цитата Сообщение от STW Посмотреть сообщение
Чем, вообще, лучше пользоваться для копирования строк?
Тем, что для этого специально придумано - strcpy.
0
0 / 0 / 1
Регистрация: 13.11.2014
Сообщений: 31
06.03.2015, 15:57  [ТС]
Т.е., если я правильно понял:
Мой неудачный случай:
C++
1
2
3
  string1 = new char [100];          // string1-адрес1
  string1 = "aaa";                        // string1-адрес2
  strcpy (string1, "privet");           // попытка записать по адресу2 (но там уже занято этим "aaa")
Как надо:
C++
1
2
3
char str[100] = "abcdefg";     // str-адрес1, по которому прописывается строка "abcdefg"
...
strcpy( str, "New string" );    // str-адрес1, по нему прописывается новая строка "New string"
Это правда?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
06.03.2015, 15:59
Цитата Сообщение от STW Посмотреть сообщение
Т.е., если я правильно понял:
Да. Только ещё надо добавить, что в первом случае происходит утечка.
0
0 / 0 / 1
Регистрация: 13.11.2014
Сообщений: 31
06.03.2015, 16:10  [ТС]
Т.е.,
в случае
C++
1
2
3
string1 = new char [100];          // string1-адрес1
string1 = "aaa";                        // string1-адрес2
strcpy (string1, "privet");           // попытка записать по адресу2 (но там уже занято этим "aaa")
теряется память, выделенная для
string1 = new char [100]; // string1-адрес1 ?

Добавлено через 7 минут
Еще вопросик:
C++
1
2
3
string1 = new char [100]; // Если используем
...
delete [] string1 ;     // То, в конце концов, надо освободить память
а если используем
C++
1
2
3
char string1 [100]; // А если используем
...
delete [] string1 ;     // То тоже надо delete, ведь string1 - тоже указатель ???
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.03.2015, 16:22
Цитата Сообщение от STW Посмотреть сообщение
То тоже надо delete, ведь string1 - тоже указатель ???
Нет. Только для new.
0
0 / 0 / 1
Регистрация: 13.11.2014
Сообщений: 31
06.03.2015, 16:24  [ТС]
Спасибо большое всем!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.03.2015, 16:24
Помогаю со студенческими работами здесь

Как правильно сделать с точки зрения реляционных БД
В базе данных нужно создать поле тип оплаты, которое может принимать только два значения: &quot;нал&quot; или &quot;безнал&quot;. Как...

Как лучше с точки зрения работоспособности и оптимизации?
Здравствуйте. Пишем небольшую узкоспециализированную социальную сеть. При написании обмена сообщениями возник вопрос и ступор. Дело в том,...

Как работать с файлами *.mht с точки зрения VB6??
Как работать с файлами *.mht с точки зрения VB6?? Всем спасибо

Как разумнее сделать авторизацию с точки зрения безопасности?
Всем привет! дайте пожалуйста совет как разумнее сделать с точки зрения безопасности. Есть два варианта: 1. После того как пользователь...

Как лучше реализовать сервер с точки зрения производительности?
Здравствуйте, хочу потренироваться в сетевом программировании и вот стал вопрос: Как лучше реализовать сервер? Т.е. асинхронный или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru