套接字更改全局变量的地址

时间:2011-10-31 19:48:15

标签: c

我在下面有这个代码(非常非常简化)。

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

extern struct1 *p;

int funct1()
{
    p = (struct1 *)malloc(sizeof(p));
    p->foo = 2;
    printf("value of foo in funct 1 is %d\n", p->foo);
    funct2();
}

int funct2()
{
    /*here do a lot of stuffs, mainly open socket,
      send some params, and close.
      Struct1 is not touched at all here*/
}

int funct3()
{
    printf("value of foo in funct 3 is %d\n", p->foo); 
}

int funct4()
{
    /*here listen to certain port, and execute funct4 
      if UDP is send to certain port*/
    funct3();
}

int main()
{
    funct1();
    funct3();
}

---- test1.h

typedef struct
{
    int foo;
}struct1;

struct1 *p = 0;

int funct1();
int funct2();
int funct3();
int funct4();

这个问题是我以某种方式破坏了地址:在funct1中,地址是例如:“20003001”,但是当我设置侦听某个端口的套接字并调用funct3时,foo变成“20003010”。它转移了一点。

所以为了简化, 我在功能1中指定了foo的值 2.调用funct 2,使用不使用struct1的任何东西的socket做很多事情 3.如果消息来到某个端口,由funct4处理,调用功能3 4. funct 3 print foo

唯一想到的是使用全局变量,但显然这很疯狂,因为它可能在内存中发生腐败。我无法将指针从功能1,2,3传递给struct,因为还有很多其他函数,只有功能1和3需要使用这个指针。

有没有人有任何想法,如何在funct3中访问“foo”而不会在全局变量中出现任何损坏?

感谢您的任何建议

2 个答案:

答案 0 :(得分:2)

p = (struct1 *)malloc(sizeof(p));

仅分配4或8个字节(取决于系统/ OS);结构的指针的大小。您需要分配内存来保存结构本身:

p = malloc(sizeof(*p));

您也不需要转换malloc的结果。

答案 1 :(得分:1)

p是一个指针,所以如果你想分配一个struct1,你需要做

p = (struct1 *)malloc(sizeof(struct1));

虽然您可能正在分配等效大小的内容,但在内存分配期间不建议“更改类型”甚至模糊类型。当它出错时,确实会发生坏事。