我在下面有这个代码(非常非常简化)。
#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”而不会在全局变量中出现任何损坏?
感谢您的任何建议
答案 0 :(得分:2)
p = (struct1 *)malloc(sizeof(p));
仅分配4或8个字节(取决于系统/ OS);结构的指针的大小。您需要分配内存来保存结构本身:
p = malloc(sizeof(*p));
您也不需要转换malloc的结果。
答案 1 :(得分:1)
p是一个指针,所以如果你想分配一个struct1,你需要做
p = (struct1 *)malloc(sizeof(struct1));
虽然您可能正在分配等效大小的内容,但在内存分配期间不建议“更改类型”甚至模糊类型。当它出错时,确实会发生坏事。