Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2012, 18:51   #1
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию Статическая память в с++.

С++ начали проходить только что, появился вопрос насчет реализации дин. массивов. Видел такой пример:
Код:
//#include <stdio.h>
//#include <stdafx.h>
#include "stdafx.h"
#include "iostream"

void main()
{
	int *b,i,v;
	//указатель на первый элемент
	b = &v;
	//занесение значений в элементы
	for(i = 0;i <= 3;i++)
	{
		*(b+i) = i;
	}
    //вывод всех элементов
	for(i = 0;i <= 3;i++)
	{
		printf("%d addr = %x\n",*(b+i),b+i);
	}

	getchar();
}
Интересует вопрос могут ли испортиться другие данные, ведь память выделяется только под переменную v при объявлении, а остальные значения используют память, которая теоретически может принадлежать другим переменным?
И насколько я знаю строки реализуются подобным образом (хранится указатель на первый элемент а знаком конца строки является нулевой элемент). Допустим инициализировал я строку:
Код:
char *ch = "TEST";
printf("%s\n", ch);
Представим она занимает в памяти определенное количество байтов, а за этими байтами находятся байты уже других переменных. Если я изменю ее длинну то могут затереться другие переменные?
Код:
ch = "TEST_TEST";
printf("%s\n", ch);
Я правильно думаю?
Вадим Буренков вне форума Ответить с цитированием
Старый 20.02.2012, 18:59   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Интересует вопрос могут ли испортиться другие данные, ведь память выделяется только под переменную v при объявлении, а остальные значения используют память, которая теоретически может принадлежать другим переменным?
Да, много чего может испортиться. Адрес возврата в стеке, например.
Цитата:
Код:
ch = "TEST_TEST";
"TEST" и "TEST_TEST" - это строки где-то в памяти, а ch - указатель, так что тут нечему портиться. Вот если
Код:
char ch[] = "TEST";
strcpy(ch, "TEST_TEST");
то да.
Somebody вне форума Ответить с цитированием
Старый 20.02.2012, 21:26   #3
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

То есть когда я пишу
Код:
ch = "TEST_TEST";
символы в кавычках записываются в неиспользуемую память и в ch записывается указатель на нее?
Тогда как мне правильно организовать массив? Я себе представляю структуру:
Код:
struct Elem 
{
	struct Elem *prev, *next;
	int v;
};
При создании новых элементов через new выделяем неиспользуемую память и записываем указатели на предыдущий и следующий элементы. Но это громоздко все, надо структуры объявлять и функции для управления элементами массива. Существуют ли другие варианты?
Вадим Буренков вне форума Ответить с цитированием
Старый 20.02.2012, 21:31   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а вам важно применить свое? почему не готовое?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.02.2012, 21:48   #5
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

На самом деле просто интересно разобраться как делают массивы в с++. А то я думал есть какой-нибудь супер способ и не надо выкручиваться.
А какие готовые варианты есть?

offtop/
Вообще удивлен: сколько о c++ слышал, а оказалось что дин. массивов стандартных нет (даже банальной проверки выхода за границы), нет арифметичеких операций с нетипизированными указателями.
Вадим Буренков вне форума Ответить с цитированием
Старый 20.02.2012, 22:08   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

std::list список, std::vector динамический массив.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.02.2012, 07:17   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Вадим Буренков Посмотреть сообщение

offtop/
Вообще удивлен: сколько о c++ слышал, а оказалось что дин. массивов стандартных нет (даже банальной проверки выхода за границы), нет арифметичеких операций с нетипизированными указателями.
А зачем они нужны, если есть контейнеры?
Впрочем, дин. массивы любых других языков по сути - же самые контейнеры.
Только внедренные в сам язык.

А по сути, что тут обертка над блоком, что там обертка над блоком.
_Bers вне форума Ответить с цитированием
Старый 21.02.2012, 13:00   #8
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Вадим Буренков
Цитата:
Вообще удивлен: сколько о c++ слышал, а оказалось что дин. массивов стандартных нет (даже банальной проверки выхода за границы), нет арифметичеких операций с нетипизированными указателями.
ну ты почитай Дизайн и эволюция С++. там дохлый страус и распинается, что специально не тянул в язык различные сущности, которые можно реализовать через классы (те же "настоящие" строки). вот и имеем кошмар в виде буста и stl. и ладно еще в шланге читабельные ошибки, связанные с шаблонами. в обычных компилях ужос же.

Цитата:
нет арифметичеких операций с нетипизированными указателями
интересно. и какие арифметические операции, по твоему мнению, нужны нетипизированным указателям?

Цитата:
Тогда как мне правильно организовать массив? Я себе представляю структуру:
это не массив, а связанный список
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 21.02.2012 в 13:03.
pproger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
динамически статическая матрица на C++ с выведением суммы Dead_inside Помощь студентам 0 19.12.2011 13:06
память offname C# (си шарп) 1 01.10.2011 10:33
статическая (lib) библиотека cucmber Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 01.03.2011 03:04
Статическая переменная ignis_divine Помощь студентам 2 12.09.2010 14:30
qt4, win32 и статическая линковка. ASGAlex Qt и кроссплатформенное программирование С/С++ 3 09.06.2009 09:13