2013-04-23 6 views
0

Мои извинения, я знаю, что многие связанные вопросы уже заданы, поэтому я буду хранить это очень просто.Использование realloc внутри функции

Несмотря на несколько лет программирования, я не могу найти правильный синтаксис для изменения размера и изменения массива (или нескольких) внутри функции. Например, скажем, я хочу функцию, чтобы заполнить массив с набором «N» чисел, где «п» определяется в пределах массива:

int main(int argc, char *argv[]) { 
    float *data = NULL 
    int n = myfunction(data); 
    for(i=0;i<n;i++) printf("%f\n",data[i]); 
    free(data); 
} 

int myfunction(float *input) { 
    int i,n=10; 
    input = (float *) realloc(input, n*sizeof(float)); 
    if(input!=NULL) { 
     for(i=0;i<n;i++) input[i] = (float)i; 
     return(n); 
    else return(-1) 
} 

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

Любые простые предложения оценены!

+1

http://c-faq.com/ptrs/passptrinit.html – hmjd

+0

честный комментарий, но не совсем то, что я искал;) – JWDN

ответ

2

Вам нужно передать указатель на указатель на myFunction

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

int myfunction(float **input) { 
    int i,n=10; 
    *input = realloc(*input, n*sizeof(float)); 
    if(*input!=NULL) { 
     for(i=0;i<n;i++) (*input)[i] = (float)i; 
     return(n); 
    } 
    else return(-1); 
} 

int main(int argc, char *argv[]) { 
    float *data = NULL; 
    int n = myfunction(&data); 
    int i; 
    for(i=0;i<n;i++) printf("%f\n",data[i]); 
    free(data); 
    return 0; 
} 
+0

Это прекрасно, спасибо! Если бы я объяснял это кому-то другому, я бы сказал, что вам нужно передать адрес массива, сообщить функции, чтобы рассматривать его как указатель на указатель, а внутри функции ссылается на сам указатель при использовании realloc() или присвоение значений. Ура! – JWDN

0

Это легче передать старый указатель на myfunction(), и он возвращает новый указатель (который может быть таким же, как и старый, если realloc() удалось развить площадь на месте).

Обратите внимание, что realloc() может потерпеть неудачу, в этом случае вы не хотите терять следы старой памяти, которая по-прежнему распределяется, поэтому перезапись одного и того же указателя без проверки - это плохая идея.

+0

Я ценю вашу мысль, и я делаю именно это в других обстоятельствах, но «настоящая» программа является более сложной, чем простой пример, который я опубликовал, и требует модификации двух или более массивов, увеличивая каждый из них с помощью realloc() как необходимо. – JWDN