Я обучаю друга C. Мы работали со структурами и указателями, и я дал ему программу, чтобы он попробовал на своем компьютере. Мы собирались разобрать программу построчно, чтобы он мог понять, как структуры и указатели работают вместе. Со своей стороны я получаю такой результат:

Значение a в астре - 5
Значение b в ASTR равно 5.550000
Значение c в ASTR равно 77
Значение d в астрах равно 888.888800

На его компьютере программа в основном работала, за исключением последнего значения astr-> d, которое выводило очень большое отрицательное число. Итак, мой вопрос: почему это происходит на его компьютере, а на моем работает нормально? ниже приведен код нарушения:

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

int main(){
    struct a_struct{
        int a;
        float b;
        int c;
        double d;
    };

    struct a_struct* astr;

    astr = (struct a_struct*)malloc(sizeof(astr));

    astr->a = 5;
    astr->b = 5.55;
    astr->c = 77;
    astr->d = 888.8888;

    printf("Value of a in astr is %d\n", astr->a);
    printf("Value of b in astr is %f\n", astr->b);
    printf("Value of c in astr is %d\n", astr->c);
    printf("Value of d in astr is %lf\n", astr->d);

    return 0;
}
0
NiaKitty 29 Май 2016 в 23:10

2 ответа

Это связано с тем, что программа неправильно распределяет память. Приведенный ниже оператор фактически назначает память, равную размеру указателя, который может быть 32-битным или 64-битным в зависимости от архитектуры ОС.

struct a_struct* astr;
astr = (struct a_struct*)malloc(sizeof(astr));

Вместо этого вам следует сделать:

struct a_struct* astr;
astr = (struct a_struct*)malloc(sizeof(struct a_struct));
1
Piyg 29 Май 2016 в 20:17

Если вы распределяете память динамически, вы должны позаботиться о том, чтобы выделить память для объекта, чтобы хранить ваши данные, а не только указатель на первый член чего-то, что вы не выделили. «Другой способ» - это сначала явно объявить структуру как переменную, а затем указатель на ее адрес:

struct a_struct astrV;
struct a_struct *astr = &astrV;
0
user3078414 29 Май 2016 в 20:44