使用内存空间和初始化分配结构变量的麻烦

时间:2012-03-31 15:57:49

标签: c memory struct

我使用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.

这个错误消息对我来说真的没有意义......这对你们任何人都有过吗?请让我知道为什么它给我这个错误消息。提前致谢。

4 个答案:

答案 0 :(得分:2)

尝试正确访问结构:

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 :(得分:1)

在标准C中,= {}语法仅支持初始化,而不支持初始化后的分配。使用循环逐个元素地复制到(*ppl_ptr)

答案 2 :(得分:1)

在C90中,您无法在作业中使用{ };仅在初始化时(即在向声明变量的同一命令中向变量提供初始值时)。

在C99中,您可以编写(*ppl_ptr)=(people){"bla","bla","bla",192,58};,但VC ++ 6.0太旧而无法支持。

您可以做的是使用初始化创建另一个变量,然后使用=复制:

people x = {"bla","bla","bla",192,58}; 
*ppl_ptr = x;

答案 3 :(得分:1)

一些提示:
1.总是将一个ponter初始化为null,否则它可能会导致垃圾值,如果在不知情的情况下访问它可能会导致问题。

people *ppl_ptr = NULL;

2。 (*ppl_ptr).first_name="bla";
   a)使用malloc,已经为其分配了50个字符空间。因此,如果将其替换为“bla”的地址,则会导致内存泄漏。幸运的是,您有l值错误以避免此类问题    b)左值是一个表达式,可以出现在等号的左侧,即可以赋值的东西。