返回Void指针截断值

pet*_*don 0 c pointers void-pointers

我无法将空指针返回到C中的另一个函数.

标头文件:

void *function2( void );
Run Code Online (Sandbox Code Playgroud)

MAIN.C

#include "myHeader.h"

void function1 (){
    void *temp = NULL;
    temp = function2();
}
Run Code Online (Sandbox Code Playgroud)

FUNCTION2.C

int a = 3;

void *function2(void){
    printf("Memory Address %p\n",&a );
    return (void *) &a; // value of &a is 0x100023444
}
Run Code Online (Sandbox Code Playgroud)

但是,function1()中temp的值是0x3444,而不是0x100023444.

有没有人知道这个解决方案,或者我做错了什么?

编辑:似乎,标题被添加到错误的位置,导致下面的AndreyT和Jonathan描述的问题,这似乎修复了截断问题.谢谢你的帮助!

AnT*_*AnT 5

在里面function1你正在调用一个尚未宣布的功能function2.在经典的C语言(C89/90)中,这是允许的,但是假定未声明的函数返回一个int.显然,在你的平台上,指针是64位宽,int是32位宽.这就是导致将64位指针值截断0x1200001234为32位的原因0x1234.

在形式上,您的代码具有未定义的行为,因为在使编译器假定function2返回后int您将其声明为返回void *.甚至C89/90编译器通常会发出关于此问题的警告(并且C99编译器报告错误).你没理睬吗?

移动整个定义function2并将其置于上方function1

void *function2(void) {
    int a = 3;
    return &a;
}

void function1 (void){
    void *temp = NULL;
    temp = function2();
}
Run Code Online (Sandbox Code Playgroud)

或者,或者,function2在调用它之前声明

void *function2(void);

void function1(void) {
    void *temp = NULL;
    temp = function2();
}

void *function2(void) {
    int a = 3;
    return &a;
}
Run Code Online (Sandbox Code Playgroud)

您必须在调用它们之前声明您的函数(最好使用原型).


Jon*_*ler 5

给定问题的修订版,我相信问题是您function2()在使用它之前没有声明。因此,编译器认为它返回的是int,而不是void *。它还应该抱怨实际定义与假设的声明不匹配。

您应该确保在使用编译器选项之前,需要为每个函数定义或声明完整的原型。

请注意,您应该声明,void *function2(void);因为void在参数列表中省略意味着完全不同-这意味着编译器不会被告知需要使用什么参数,也可以不告诉它没有参数。(这与C ++有所不同。)

您仍然遇到问题,因为要返回指向局部变量的指针。您可能可以打印指针(尽管即使标准也不能保证),但是您不能可靠地使用它。

extern void *function2(void);

void function1(void)
{
    void *temp = function2();
    printf("Address: %p\n", temp);
}

void *function2(void)
{
    int a = 3;
    printf("Address: %p\n", &a);
    return &a; // value of &a is 0x1200001234
}
Run Code Online (Sandbox Code Playgroud)

或者在定义function2()之前定义function1()


请注意,在函数定义的位置(以确保定义与标头一致)和函数的使用位置(以确保用法与标头一致)中都包括标头至关重要。只要您这样做,一切都会好起来的。