//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));
^
有什么建议吗?
答案 0 :(得分:1)
看来,nr
是int
的数组,而不只是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;
}