从函数返回错误的地址

时间:2017-05-15 17:05:08

标签: c

我有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 .....

1 个答案:

答案 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