为什么当字节数malloc很大时函数的返回值会变化?
函数.c:
\n#include "func.h"\n\nint *func()\n{\n int *ptr = (int *)malloc(100000000);\n printf("ptr in func is %p \\n", ptr);\n return ptr;\n}\nRun Code Online (Sandbox Code Playgroud)\n函数.h:
\n#ifndef _FUNC_H\n#define _FUNC_H\n#include <stdio.h>\n#include <stdlib.h>\n//int *func();\n#endif\nRun Code Online (Sandbox Code Playgroud)\n主程序
\n#include <stdio.h>\n#include "func.h"\n\nint main(int argc, char** argv)\n{\n int *ptr = func();\n printf("ptr is %p \\n", ptr);\n}\nRun Code Online (Sandbox Code Playgroud)\n编译并运行:
\ngcc -g main.c func.c -o main\nRun Code Online (Sandbox Code Playgroud)\n编译结果为:
\nmain.c: In function \xe2\x80\x98main\xe2\x80\x99:\nmain.c:7:13: warning: implicit declaration of function \xe2\x80\x98func\xe2\x80\x99; did you mean \xe2\x80\x98putc\xe2\x80\x99? [-Wimplicit-function-declaration]\n int* ptr = func();\n ^~~~\n putc\nmain.c:7:13: warning: initialization makes pointer from integer without a cast [-Wint-conversion]\nRun Code Online (Sandbox Code Playgroud)\n运行结果:
\nmain.c: In function \xe2\x80\x98main\xe2\x80\x99:\nmain.c:7:13: warning: implicit declaration of function \xe2\x80\x98func\xe2\x80\x99; did you mean \xe2\x80\x98putc\xe2\x80\x99? [-Wimplicit-function-declaration]\n int* ptr = func();\n ^~~~\n putc\nmain.c:7:13: warning: initialization makes pointer from integer without a cast [-Wint-conversion]\nRun Code Online (Sandbox Code Playgroud)\n为什么当字节数malloc较小时函数返回相同的值?
函数c
\nptr in func is 0x7f557ea88010\nptr is 0x7ea88010\nRun Code Online (Sandbox Code Playgroud)\n运行结果:
\nptr in func is 0x17af2a0\nptr is 0x17af2a0\nRun Code Online (Sandbox Code Playgroud)\n你能告诉我为什么吗?\n我想知道到底是什么原因造成的?
\n显然您正在 64 位系统上使用sizeof(int *) == 8和sizeof(int) == 4。现在,当函数原型丢失(“隐式声明”)时,编译器会假定func()返回int,因此当您调用时,仅使用返回值的int *ptr = func()4 个字节 ( ),将其解释为并强制转换回. 这会导致第一个示例中的错误。sizeof(int)intint *ptr
在第二个示例中,碰巧指针值较小,因此它完全适合 4 个字节,并且在强制转换后,结果再次是相同的指针。尽管如此,它是未定义的行为,您应该始终将警告“隐式声明”视为错误并提供所有必要的原型。
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |