2016-03-19 3 views
0

Я играю с C. Просто задайте несколько вопросов, по которым лучше всего практиковать, и если я что-то делаю неправильно.Лучший способ передать указатели между функциями

Я сделал программу, которая, кажется, работает:

void main() 
{ 
    char *text; 
    text = malloc(10 * sizeof(char)); 
    dosomethingwithtext(text); 
    printf("%s\n", text); 
} 

Однако я также видел версию, как это: (я знаю, что это не будет ничего значимого печати, потому что я не добавил символов , но представьте себе, что у меня было!)

void main() 
{ 
    char *text; 
    text = dosomething(); 
    printf("%s\n", text); 
} 
char * dosomething() 
{ 
    char *text; 
    text = malloc(10 * sizeof(char)); 
    return text; 
} 

Или, если любой из них не оптимален, что является лучшим способом. В основном я задаю самый общий/лучший способ сделать это.

+0

Тип мнения основан, но я уверен, что вы получите ответы, которые делают случай для обоих способов. ИМО, оба пути имеют свои преимущества в зависимости от того, где их называют. Но в обоих случаях вы должны помнить оператор 'free()'. – ryyker

+1

'void main()' является недопустимой сигнатурой для 'main' и устаревшим синтаксисом для любого декларатора функций. – Olaf

+0

@Olaf 'устаревший синтаксис для любой функции declarator', не могли бы вы расширить? – xvan

ответ

1

a) В обоих случаях вы не смогли освободить память. Вызовы в malloc должны быть уравновешены звонком на бесплатный.

б) SizeOf (Char) определяется как 1 в C, так что нет никакого смысла вызова SizeOf (Char)

с) Это не void main(), это int main(void) или int main(int argc, char** args) - вам необходимо предоставить возвращаемое значение ,

Чтобы ответить на фактический вопрос, все в порядке. Возможно, во втором случае вам становится сложнее управлять памятью, потому что вы не можете поместить функцию free() в ту же функцию, что и malloc() - ваш dosomething() возвращает выделенный блок. Тем не менее, очень часто заканчиваются программы, которые выделяют в одном месте и бесплатно в другом.

+0

Я считаю, что литье из 'void *' теперь устарело. – chrylis

+2

для C литой не требуется. Для C++ требуется. – ryyker

+0

На C он все равно может выдавать предупреждения, поэтому лучше избегать шума. – xvan

-1

Вариант 1 имеет то преимущество, что распределение и снятие с производства осуществляются в том же объеме, что (в полностью основанном на мнениях) легче отслеживать и отлаживать. Вы можете использовать возвращаемое значение, чтобы сообщить о каком-то статусе.

Вариант 2 следует за Creational pattern, который является причиной утечки в неуправляемой памяти. Единственный возможный отчет о состоянии - пустой указатель. (что может быть или не быть достаточным).

+0

Большинство нетривиальных кодов не является кодом 'free' в той же области, в которой он был выделен. Он может быть подвержен ошибкам для передачи выделенной памяти. – Olaf

+0

Но забыть выделять память легче отлаживать на любой современной ОС. Чтобы найти утечку, вам сначала нужно знать, что у вас ее есть. – xvan

+0

1) Пожалуйста, правильно адресуйте комментарии, иначе они могут не отображаться. Сказал, что: в C есть больше программирования на C, чем на уровне ПК. И ваше утверждение неверно, как общее. На это нет простого ответа, и это сильно зависит от приложения. Просто попробуйте написать нетривиальную программу с динамически распределенной памятью, и вы можете это понять. – Olaf

Смежные вопросы