2015-02-20 4 views
1

У меня есть следующие программы:Возвращение malloced указатель в C

#include <stdio.h> 
#include <stdlib.h> 

char* getStr(int length) { 
    char* chars = malloc(length + 1); 
    int i; 
    for(i = 0; i < length; i++) 
     chars[i] = 'X'; 
    chars[i] = '\0'; 
    // no call to free() 
    return chars; 
} 

int main(int argc, char** argv) { 
    char* str; 
    str = getStr(10); 
    printf("%s\n", str); 
    free(str); 
    return EXIT_SUCCESS; 
} 

Он печатает 10 X «с, как я ожидал. Будет ли это вести себя на любой платформе с любым компилятором? Является ли память еще malloced после getStr() возвращается?

(я не хочу, чтобы передать указатель в качестве аргумента: D)

+0

Да, память по-прежнему выделяется после возвращения функции. – Cyclonecode

+0

Он хорошо определен на всех платформах и системах. Если вы выделяете память с помощью 'malloc', она остается выделенной до тех пор, пока вы явно не назовете' free'. (Большинство основных операционных систем также освобождают выделенную память при выходе процесса.) –

+1

Не забудьте проверить указатель на 'NULL' перед разыменованием указателя, это может быть просто простой пример, но, пожалуйста, не забудьте его, вы будете не пожалеете. –

ответ

3

Да, код выглядит действительным и поведение должно быть надежным с любым компилятором C.

И, да, память по-прежнему выделяется после того, как getStr() возвращается. Таким образом, звонок free() также верен.

Не забудьте проверить, если malloc() возвращает NULL, в случае недостаточной памяти.

+0

Я вызываю 'free()' в 'main()' - третью строку снизу - это нормально? – lukasrozs

+0

Да, хорошо выглядит. Я обновил свой ответ. –

3

Если вы используете malloc для выделения памяти, он будет по-прежнему выделяется, пока вы явно не вызовете free на него, независимо от того, как она прошла вокруг между функции, возвращенные и т. д.

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