返回Void指针截断值

时间:2014-10-06 02:37:35

标签: c pointers void-pointers

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

HEADER FILE:

void *function2( void );

MAIN.C

#include "myHeader.h"

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

FUNCTION2.C

int a = 3;

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

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

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

EDITED: 似乎,标题被添加到错误的位置,导致下面的AndreyT和Jonathan描述的问题,这似乎解决了截断问题。谢谢你的帮助!

3 个答案:

答案 0 :(得分: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();
}

或者,在调用之前声明function2

void *function2(void);

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

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

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

答案 1 :(得分:4)

鉴于该问题的修订,我确信问题在于您在使用之前未声明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
}

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


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

答案 2 :(得分:0)

这个答案不同于截断。

在function2()a中是局部变量。范围和生命周期od a仅限于函数2。因此将地址返回到其他功能是非法的。它会导致未定义的行为。请注意学习C中的存储类