使用结构指针访问结构的指针成员

时间:2016-01-01 06:21:18

标签: c pointers data-structures

我在结构中定义了整数指针。我想使用结构指针使用该成员指针。我的代码如下所示:

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

struct abc
{
        int *x;
};

int main()
{

        struct abc *p = (struct abc*)malloc(sizeof(struct abc));
        p->x = (int*)malloc(sizeof(int));
        p->x = 10;
        printf("The value is %d\n",p->x);
        free(p);
}

现在我按照我的期望获得输出。但是我在编译时收到了警告信息。警告信息是:

temp.c:14:7: warning: assignment makes pointer from integer without a cast [enabled by default]
temp.c:15:2: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat]

我也试过了,

*p->x = 10
 printf("The value is %d\n",*p->x);

但它不起作用。

如何解决此警告?

5 个答案:

答案 0 :(得分:1)

只有这个是错字 -

*p->x= 10               /* <-- missing ;  */
printf("The value is %d\n",*p->x);
在释放free(p->x)之前

以及p

Working example

答案 1 :(得分:1)

为了为指针指向的内存地址赋值,当用作 lvalue 时,必须取消引用指针。 e.g:

*p->x = 10;

分配内存时,无需转换malloc的返回值。 malloc(和calloc等等。)只返回内存地址,它没有类型(或类型void)。此外,当您使用“sizeof 对象”时,可以消除指定类型时出错的风险(使用typedef时会更明显,等等) 。例如,您的分配应该只是:

struct abc *p = malloc (sizeof *p);
p->x = malloc (sizeof *p->x);

最后,在你的动态分配内存的任何代码中,你有2个责任分配任何内存块:(1)总是保留一个指向内存块起始地址的指针,所以,(2)它可以是在不再需要时释放。

必须使用内存错误检查程序,以确保您没有在已分配的内存块之外/之外写入,尝试读取或基于未初始化的值跳转,最后确认您已释放所有内存你分配的记忆。这是你不能做的事情。如果你分配它,free当它不再需要时。 E.g:

free (p->x);
free (p);

有许多微妙的方法可以滥用新的内存块。使用内存错误检查器可以识别任何问题并验证您分配的内存的正确使用情况,而不是通过segfault找出问题。对于Linux valgrind是内存错误检查程序的正常选择。每个平台都有类似的记忆检查器。它们都很简单易用,只需通过它运行程序即可。 E.g:

$ valgrind ./bin/struct_simple
==21079== Memcheck, a memory error detector
==21079== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==21079== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==21079== Command: ./bin/struct_simple
==21079==

 The value is 10

==21079==
==21079== HEAP SUMMARY:
==21079==     in use at exit: 0 bytes in 0 blocks
==21079==   total heap usage: 2 allocs, 2 frees, 12 bytes allocated
==21079==
==21079== All heap blocks were freed -- no leaks are possible
==21079==
==21079== For counts of detected and suppressed errors, rerun with: -v
==21079== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

您要确认All heap blocks were freed -- no leaks are possibleERROR SUMMARY: 0 errors from 0 contexts

祝你在新的一年中编码好运。

答案 2 :(得分:0)

更改两行:

*p->x = 10;

printf("The value is %d\n",*p->x);

它会起作用..

答案 3 :(得分:0)

试试这个:

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

struct abc
{
        int *x;
};

int main()
{

        struct abc *p = (struct abc*)malloc(sizeof(struct abc));
        p->x = (int*)malloc(sizeof(int));
        int i=10; 
        p->x = &i; //or *p->x = 10; 
        printf("The value is %d\n",*(p->x));
        free(p);
}

问题在于您将值10 分配给指针,并且它将其作为地址而不是值,并且您尝试打印使用%d 的地址,因此编译器显示警告。要首先删除那个需要取消结构成员的整数指针,现在需要取消整数指针以指定值。或者你可以拿一个整数,可以存储如下:

p-&gt; x =&amp; i。

通过上面的结构指针访问作为结构成员的指针是正确的方法。

答案 4 :(得分:0)

"p->x" can hold only address of an integer as it is a pointer. So instead of value assign address to it.

struct abc
{
        int *x;
};

int main()
{
        int i = 10;
        struct abc *p = (struct abc*)malloc(sizeof(struct abc));
        p->x = (int*)malloc(sizeof(int));
        p->x = &i;
        printf("The value is %d\n",*p->x);
        free(p);
}