2015-06-24 3 views
2

У меня есть эта функция:C функция и символ *

void print_pol(char* pol); //or char[] 
    printf("%s", pol); 
} 

В main(), я называю эту функцию, как показано ниже

print_pol("pol1"); 

Но я не выделяет память для char* pol в программе. Так как это возможно? Я знаю, что указатель должен указать на что-то.

ответ

4

"poll1" - строковый литерал с типом длины-6 массив символов, char[6]. Сами данные хранятся в постоянной памяти. Ваш параметр функция pol может выглядеть как массив, но он настроен на char*, давая вам:

void print_pol(char* pol){ ... 

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

1

В вашем коде "pol1" называется string literal. Во время компиляции эти данные сохраняются в некоторой области памяти (обычно постоянная память, которая не может быть изменена или, по крайней мере, любая попытка изменить содержимое приведет к), который выделяется самим компилятором.

Когда вы используете его, вы по существу передаете базовый адрес строкового литерала и собираете его в char * (то же, что и char [] в случае использования в параметре функции). Нет необходимости в каком-либо распределении с вашей стороны.

0
void print_pol(char pol[]) 
{   
    printf("%s", pol); 
} 


int main() 
{ 
    print_pol("pol1"); 
    return 0; 
} 

После вызова функции print_pol("pol1"), в определении функции он преобразуется в указатель и print_pol(char* pol);char *pol указывает точно на первом месте массива символов.

Следовательно, память не требуется или не выделяется для нее.

0

Компилятор компилирует print_pol("pol1") следующим образом:

  • Выделяет блок 5 последовательных символов в только для чтения сегмента памяти исполняемого образа, содержащим символы 'p', 'o', 'l', '1' сопровождаемыми null знак ('\0').

  • Передайте адрес памяти этого блока для функции print_pol.

Чтобы ответить на ваш вопрос, компилятор выделяет эту память.