//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 = %dn", user[0].nr);
}
int main()
{
int n;
utilizator *user = malloc (sizeof(utilizator));
citire_mesaje(user, n);
return 0;
}
我做错了什么?我使用 user[0].nr 只是为了更轻松地测试它。如果我只使用结构类型的一个元素(utilizator user;(,我可以让它工作,但是如果我使用指针,我无法弄清楚。我得到:
warning: assignment makes integer from pointer without a cast [enabled by default]
user->nr = malloc (n * sizeof(int));
^
有什么建议吗?
似乎nr
是一个int
数组,而不仅仅是int
.修复它的声明:
typedef struct {
int * nr;
char *nume, **mesaj;
} utilizator;
如果你只想要一个int
,不要打电话给malloc
。它将被分配为utilizator
对象的一部分(顺便说一句,有趣的词(。
首先,您不需要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 = %dn", user[0].nr);
return ;
}
int main()
{
int n = 0 ;
utilizator *user = malloc (sizeof(utilizator));
citire_mesaje(user, n);
free( user ) ;
return 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 = %dn", 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;
}