Проблема с выделением структурной переменной с пространством памяти и инициализацией - PullRequest
0 голосов
/ 31 марта 2012

Я использую Visual C ++ 6.0 для практики работы с указателями, вот мой код:

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

typedef struct 
{
    char first_name[50];
    char middle_name[50];
    char last_name[50];
    int height;
    int weight;
}people;

int main()
{
    //declare a people structure pointer
    people *ppl_ptr;

    //allocate memory space for people structure
    ppl_ptr = malloc(sizeof(people));

    //check if you run out of the heap
    if(ppl_ptr==NULL)
    {
        printf("Out of memory!\n");
        return 0;
    }

    //initialize the unname people varible 
    (*ppl_ptr)={"bla","bla","bla",192,58};



    return 0;
}

, но я получил синтаксическую ошибку: C:\C Practice\ch14.c(30) : error C2059: syntax error : '{' Error executing cl.exe.

и если я заменю (*ppl_ptr)={"bla","bla","bla",192,58};

с чем-то вроде (*ppl_ptr).first_name="bla";

Я получу другую ошибку:

ch14.c
C:\C Practice\ch14.c(30) : error C2106: '=' : left operand must be l-value
Error executing cl.exe.

, и эта ошибка msg на самом деле не имеет смысла для меня ..Это случается с кем-нибудь из вас?Пожалуйста, дайте мне знать, почему он выдает мне эту ошибку.Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 31 марта 2012

Попробуйте получить доступ к структуре правильно:

char* bla_str_ptr = "bla";
[...]
strcpy(ppl_ptr->first_name, bla_str_ptr);
strcpy(ppl_ptr->middle_name, bla_str_ptr);
ppl_ptr->height = 123;
[...]

Вы также можете написать функцию инициализации с такой подписью:

void ppl_init(char* first_name, char* middle_name, [...])
1 голос
/ 08 декабря 2014

Несколько советов:
1. Всегда инициализируйте ponter, чтобы он обнулялся, иначе это может привести к мусорному значению, которое, если к нему неосознанно обращаются, может вызвать проблемы.

people *ppl_ptr = NULL;

2. (*ppl_ptr).first_name="bla";
a) С помощью malloc ему уже выделено 50 символов. Так что если вы замените его на адрес «бла», вы будете вызывать утечку памяти. К счастью, у вас есть ошибка l-значения, чтобы избежать такой проблемы.
б) L-значение - это выражение, которое может появляться слева от знака равенства, то есть что-то, чему можно присвоить значение.

1 голос
/ 08 декабря 2014

В C90 нельзя использовать { } в назначениях;только при инициализации (т.е. при предоставлении начальных значений переменной в той же команде, что и при объявлении переменной).

В C99 вы могли бы написать (*ppl_ptr)=(people){"bla","bla","bla",192,58};, но VC ++ 6.0 слишком стар, чтобы поддерживать это.

Что вы можете сделать, это создать другую переменную, используя инициализацию, а затем скопировать, используя =:

people x = {"bla","bla","bla",192,58}; 
*ppl_ptr = x;
1 голос
/ 31 марта 2012

В стандарте C синтаксис = {} поддерживается только для инициализации, но не для назначения после инициализации.Используйте цикл для копирования в (*ppl_ptr), элемент за элементом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...