2013-10-24 4 views
4

Я хочу иметь функцию C, которая читает файл и возвращает динамический массив из int. Каков наилучший способ инициализации указателей для этого массива?Каков самый чистый способ инициализации указателей в C?

Моя текущая версия:

void readFile(int* array,int* size){ 
    // ...read the file and see there are X integers... 
    array = malloc(X * sizeof(int)); 
    *size = X; 
    // ... fill the array ... 
    } 
int main() { 
    int* array; 
    int size; 
    readFile(array,&size); 
    //Work with array 
    return 0; 
} 

Это дает мне инициализированы предупреждения, это нормально, просто сделать

int* array = NULL 

или есть лучше и чище способ для достижения этой цели?

+0

Почему вы не используете mmap()? Почему бы вам не использовать pread()? – dAm2K

+0

Возможный дубликат [простой вопрос инициализации указателя] (http://stackoverflow.com/questions/1367363/simple-pointer-initialization-question) –

+4

Вам нужно передать массив int ** в readFile(), иначе вы не возвращая адрес malloc() – OldProgrammer

ответ

5

Технический комментарий

Во-первых, у вас возникли проблемы, потому что readFile принимает int *, не int **. Если у вас

void readFile(int **array, int *size) { 
    *array = malloc(X * sizeof(int)); 
    ... 

вы на самом деле быть в состоянии назвать это как в

int main() { 
    int *array, size; 
    readFile(& array, & size); 
    ... 

так вызывающего абонента array будет указывать на то, что readFile выделено.

Дизайн вопрос

К вашему конкретному вопросу, технически и возможно, до тех пор, как ответственность за инициализации/выделения и очистки понятны:

  • main выделяет массив, и readFile заливок Это.
  • readFile выделяет и заполняет массив содержимым вашего файла.

main может выделить память, потому что это функция, которая будет знать, когда очищать (освобождать память). В противном случае блок, в котором реализован readFile, также может реализовать функцию freeFile для других пользователей.

+0

«некоторые могут утверждать, что основной задачей является выделение памяти» - они могут спорить, но они не выиграют аргумент. –

+0

Это точка, за исключением бит о главном распределении памяти. Для простых типов (например, массивов int), если понятно, кто владеет указателем, это не имеет значения. Для сложных типов распределение и освобождение должно выполняться с помощью функций 'xxx_new' и' xxx_delete', поэтому это все равно не имеет значения; ключ дает понять, кто на самом деле владеет указателем. – sfstewman

+0

@ s.bandara Спасибо за ваши ответы! Я не уверен, как вы подразумеваете «main выделяет массив», потому что в основном я не знаю, насколько большой массив должен быть. – JHnet

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