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描述的问题,这似乎修复了截断问题.谢谢你的帮助!
在里面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)
您必须在调用它们之前声明您的函数(最好使用原型).
给定问题的修订版,我相信问题是您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()。
请注意,在函数定义的位置(以确保定义与标头一致)和函数的使用位置(以确保用法与标头一致)中都包括标头至关重要。只要您这样做,一切都会好起来的。