2014-02-20 4 views
0

Я знаю, что это был ответ раньше, но я не могу найти вопрос.
Каковы различия между этими двумя инициализацыми:Разница между этими двумя указателями на инициализацию char

int main() 
{ 
    char* pch1; 
    char* pch2; 

    pch1 = (char*)malloc(sizeof(char) * 5); 
    strcpy(pch1, "Text"); 

    pch2 = "Text"; 
} 
+1

Одна указует на кучу памяти, другой к статическому сегменту данных prgoram – StoryTeller

ответ

2

Во-первых: не бросайте повторно значение поворота от malloc - это общий источник ошибок. Do I cast the result of malloc?

pch1 = malloc(sizeof(char) * 5); 

присваивает указатель на динамически выделенный блок 5 байт в куче.

pch2 = "Text"; 

В идеале следует избегать, поскольку он назначает указатель на строковый литерал. Строковые литералы доступны только для чтения в большинстве ОС, а также являются распространенным источником ошибок. Если вы сделаете это, вы должны сделать указатель на const

const char * pch2 = "Text"; 
+0

Я не запрограммировал это в C, но везде вижу, что возвращаемое значение из malloc оно отлито. Можете ли вы сказать мне, почему это неправильно? – Kobe

+0

@vBx, вероятно, вы видели в C++ c mix codes – qwr

+1

В C++ вы должны отливать, в C вы не должны. Подробно объясняется здесь: http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc –

2

Там три основных отличия здесь:

  • Первыми один копирует содержимое строкового литерала в динамическую память, а второй точек прямо к этому буквалу.
  • Редактирование pch1 строка является законной; изменение pch2 строка является незаконной
  • Чтобы избежать утечки памяти, вам необходимо освободить pch1.

Для полноты рассмотрит pch3, который инициализируется следующим образом:

char tmp[] = "Text"; 
char *pch3 = tmp; 

Это pch3 является изменяемым, как вашим pch1, но он не нуждается в освобождении, поскольку содержание строки копируется в автоматическую память ,

+0

Хмм, так вот оно. Благодарю. – Kobe

1

pch1 указывает на кучу

вы можете изменить его в bounderies

плюс вы должны освободить его

другие точки статического сегмента данных вы не можете изменить его

0
  1. pch1 будет использовать память кучи для хранения ваших данных
  2. pch2 - с использованием стеки памяти
Смежные вопросы