C语言 结构、指针和内存分配


//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;
}

相关内容

  • 没有找到相关文章

最新更新