Выделение памяти - PullRequest
       31

Выделение памяти

0 голосов
/ 28 мая 2011
typedef struct {
    float *numbers;
    float val1;
    float val2;
} Values; 
Values val[16];

Как можно выделить память для чисел в структуре?

Ответы [ 2 ]

3 голосов
/ 28 мая 2011

Если вы хотите выделить место для одного числа с плавающей точкой в ​​первом элементе вашей структуры, вы должны сделать это так:

#include <stdlib.h>

/* ... */

val[0].numbers = malloc(1 * sizeof(float)); /* "1 * " for clarity... */

Если ты это имел в виду.

2 голосов
/ 28 мая 2011

Итак, вы можете сделать это без использования динамического выделения памяти, например:

typedef struct {
    float *numbers;
    float val1;
    float val2;
} Values; 

#define MAX_SIZE 16

int main() {
    Values val[MAX_SIZE];
    float myfloats[MAX_SIZE];
    int i;
    for(i=0;i<MAX_SIZE;i++) {
        val[i].numbers=&myfloats[i];
    }
    return 0;
 }

Но я не могу придумать причину, по которой вам нужна структура с указателем только на один float.

Исходя из имени 'numbers', я бы сказал, что вы хотите, чтобы 'numbers' указывал на массив floats, если это так, вы можете сделать это:

#include <malloc.h>

typedef struct {
    float *numbers;
    float val1;
    float val2;
} Values; 

#define MAX_SIZE 16

int main() {
    Values val[MAX_SIZE];
    size_t numberOfFloats = 10;
    int i;

    // for each of the members of the val array
    for(i=0;i<MAX_SIZE;i++) {
        // allocate using calloc (this will set all of the floats to 0.0)
        val[i].numbers=calloc(numberOfFloats,sizeof(float));

        // check the allocation worked...
        if(!val[i].numbers) {
            // insert proper error handling here.
            printf("oops\n");
            return -1;
        }

    }

    // you access the variables like this
    for(i=0;i<MAX_SIZE;i++) {
        int number;
        for(number=0; number < numberOfFloats; number++) {
            printf("Value %d, Number %d = %f\n",i,number,val[i].numbers[number]);
        }
    }

    // don't forget to play nice and clean up afterwards
    for(i=0;i<MAX_SIZE;i++) {
        free(val[i].numbers);
    }
    return 0;
 }
...