结构,指针和内存分配

时间:2013-12-07 09:12:51

标签: c struct malloc

//The struct
typedef struct {
    int nr;
    char *nume, **mesaj;
} utilizator;

void citire_mesaje(utilizator *user, int n)
{
    user->nr = malloc (n * sizeof(int));
    scanf("%d", &user[0].nr);
    printf("user[0].nr = %d\n", user[0].nr);
}
int main()
{
    int n;
    utilizator *user = malloc (sizeof(utilizator)); 
    citire_mesaje(user, n);

    return 0;
}

我做错了什么?我使用user [0] .nr只是为了更容易测试它。如果我只使用struct(utilizator user;)类型的一个元素,我可以使它工作,但如果我使用指针,我无法弄明白。我明白了:

 warning: assignment makes integer from pointer without a cast [enabled by default]
 user->nr = malloc (n * sizeof(int));
           ^

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

看来,nrint的数组,而不只是int。修复它的声明:

typedef struct {
    int * nr;
    char *nume, **mesaj;
} utilizator;

如果您只想要一个int,请不要致电malloc。它将被分配为utilizator对象的一部分(有趣的单词btw)。

答案 1 :(得分:0)

首先,您不需要user->nr = malloc (n * sizeof(int));,因为nr只是int,并且它有自己的长度为sizeof(int) bytes的内存空间。

其次也是最重要的,

  

您未包含头文件#include <stdlib.h>。由于这一点,malloc函数被隐式声明为返回int。由于您将结果视为指针,因此存在类型不匹配警告。

您只需要包含文件stdlib.h即可。

在这种情况下,

void*将被安全地提升为任何其他指针类型。

所以,你的代码应该像这样::

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

typedef struct {
    int nr;
    char *nume, **mesaj;
} utilizator;

void citire_mesaje(utilizator *user, int n)
{
    scanf("%d", &user[0].nr);
    printf("user[0].nr = %d\n", user[0].nr);
    return ;

}
int main()
{
    int n = 0 ;
    utilizator *user = malloc (sizeof(utilizator)); 
    citire_mesaje(user, n);
    free( user ) ;

    return 0;
}

答案 2 :(得分:0)

您正在以错误的方式为变量分配内存。您应该使用casting(将malloc返回的值的类型更改为变量的类型):

// In the citire_mesaje function
user->nr = (int) malloc (n * sizeof(int));
// In the main function
utilizator *user = (utilizator *) malloc (sizeof(utilizator)); 

您的最终代码应如下所示:

//The struct
typedef struct {
    int nr;
    char *nume, **mesaj;
} utilizator;

void citire_mesaje(utilizator *user, int n)
{
    user->nr = (int) malloc (n * sizeof(int));
    printf("Enter a value for user[0].nr: ");
    scanf("%d", &user[0].nr);
    printf("user[0].nr = %d\n", user[0].nr);
}
int main()
{
    int n; // make sure to inisialize the n variable
    utilizator *user = (utilizator *) malloc (sizeof(utilizator));
    citire_mesaje(user, n);

    return 0;
}