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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2008, 22:56   #1
StarWorm
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 233
Восклицание отличие char* str ="..." от char ...[]="..."

Хочу узнать в чем заключается принципиальное отличие!
При написании такого кода:
Код:
#include "stdafx.h"
# include <stdio.h>
# include <conio.h>
# include <iostream>

using namespace std;

void clearStr(char* arrStr)
{
	char* tmp;
	int result;
	while((tmp=strstr(arrStr,"  "))!=NULL)
	{
		result=(int)(tmp-arrStr+1);
		while(arrStr[result]!=NULL)
		{
			arrStr[result++]=arrStr[result+1];
		}
	}		
}

int main()
{
	char* str = new char[200];
	gets(str);
	str="hello    my dear  world  !  !!";
	char str1[]="hello    my dear  world  !  !!";
	clearStr(str);
	clearStr(str1);
	cout<<str<<"\n"<<str1;

	delete [] str;
	getch();
	return 0;
}
прога должна убирать "лишние" пробелы, не включая начальные и конечные!
В итоге если я заполняю char* str = "..." то при передаче в функцию я не могу ищменять символы, а также не работает delete [] str!
Если же я заполняю при помощи gets(str) ну или cin.getline(str,255) - то все нормально!
Ну а если я заполняю как char str[]="..." то тоже все пучком и ничто нигде не ругается!
Просто я уже оч. привык работать с указателями и запись вида 'typedef' vae[] для меня является дикой...
StarWorm вне форума Ответить с цитированием
Старый 19.11.2008, 23:32   #2
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Код:
/*1*/ char *str1 = "string";
/*2*/ char str2[] = "string";
Отличие в том, что str1 – это указатель на первый байт строки, которая размещена в сегменте данных программы, изменять который нельзя. str2 – это массив, память под строку будет выделена на стеке.
Цитата:
Сообщение от StarWorm Посмотреть сообщение
Код:
	char* str = new char[200]; // 1
	str="hello    my dear  world  !  !!"; //2
	delete [] str; //3
В итоге если я заполняю char* str = "..." то при передаче в функцию я не могу ищменять символы, а также не работает delete [] str!
Мда... delete[] отлично работает, просто то, что вы ему подсовываете... Рассмотрим эти три строчки:
1) выделение памяти, адрес первого байта записываем в указатель.
2) присваиваем адрес первого байта строки из сегмента данных в указатель, при этом теряя адрес того блока, под который ранее была выделена память. Вот наглядный пример утечки памяти.
3) пытаемся удалить память, вот только передаем не тот адрес, потому и крешится программа.
filosof_x86 вне форума Ответить с цитированием
Старый 20.11.2008, 08:48   #3
StarWorm
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 233
По умолчанию

Спасибо, вопрос решен!!! Наконец то до меня дошло!
StarWorm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add") в C++ Builder AleksP C++ Builder 7 11.04.2009 13:06
C++, препроцессор, как из "int" сделать "char"? Максай Помощь студентам 3 05.09.2008 08:16
если пользователь наберет какой-то другой символ не "y" или "n" и нажмет enter, программа проигнорирует skobets Общие вопросы C/C++ 2 03.06.2008 06:51
Excel файл открывается не "до конца" (странички "не показываются" только серое поле) Dorvir Microsoft Office Excel 2 28.03.2008 10:03
Создаю диаграмму "Bar". Подскажите как убрать растояние между "столбами" MAcK Компоненты Delphi 11 24.10.2007 10:49