我有3个文件
a.h
:
Struct a{ int I;}
b.c
:
#include "a.h"
Main(){
Struct a *b= hello();
}
C.c
:
#include"a.h"
Struct a *hello(){
Struct a *c= malloc (size of *(*c));
c->I = 100;
Return c;
}
首先编译.H文件,然后编译cc文件然后编译bc文件,所以这里主调用hello()函数并返回c值地址是正确的,而我分配给b时,它给出了错误的地址,例如c值是0x10322345然后b就像这样的0xffff345 .....
答案 0 :(得分:1)
首先,始终打开编译器的警告!使用gcc
,可以通过传递
-Wall -Wextra -pedantic
虽然奇怪的是,有问题的警告默认在gcc
开启,所以你应该看到类似
main.c: In function ‘main’:
main.c:6:14: warning: initialization makes pointer from integer without a cast [enabled by default]
如果您不理解警告,请不要忽视它!问一下。
您在没有声明的情况下致电hello
,因此将其隐式声明为int hello();
a.h
:
typedef struct { int i; } a_t;
a_t* hello(void);
a.c
:
#include <stdlib.h>
#include "a.h"
a_t* hello(void) {
a_t* a = malloc(sizeof(a_t));
a->i = 100;
return a;
}
main.c
:
#include <stdio.h>
#include <stdlib.h>
#include "a.h"
int main(void) {
a_t* a = hello();
printf("%d\n", a->i);
free(a);
return 0;
}
输出:
$ gcc -Wall -Wextra -pedantic -o main main.c a.c && main
100