当前位置 : 主页 > 编程语言 > c语言 >

c语言学习困惑(一)

来源:互联网 收集:自由互联 发布时间:2023-09-14
通过返回局部变量的指针并输出,因为局部变量在函数执行完之后就会销毁,但是执行的结果却是有所不同 #include stdio.h#include stdlib.h#include string.hchar *print_stack();char *print_stack1();int main(){

通过返回局部变量的指针并输出,因为局部变量在函数执行完之后就会销毁,但是执行的结果却是有所不同

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *print_stack();
char *print_stack1();

int main()
{
    char *d;
    char *p;
    d = print_stack();
    printf("main d 变量存储的地址: %p\n", d);
    printf("d=%s\n", d);
    p = print_stack1();
    printf("main p 变量存储的地址: %p\n", p);
    printf("p=%s\n", p);
    return 0;
}
char *print_stack()
{
    char c[17] = "I am print_stack";
    puts(c);
    printf("c 变量存储的地址: %p\n", c);
    return c;
}
char *print_stack1()
{
    char c[17] = "I am print_stack";
    char *p;
    p = c;
    puts(p);
    printf("p 变量存储的地址: %p\n", p);
    return p;
}

结果: image.png

初步结论: 变量c是一个局部变量,它在函数执行完毕后会被销毁。然而,将指向该局部变量的指针d和p返回给了main()函数。当你尝试在main()函数中访问这些指针时,你实际上正在访问已经不存在的内存空间,这会导致未定义的行为。 因此,当你尝试打印d和p时,输出的结果是不确定的。有可能是原始值,也有可能是空指针(null),这取决于编译器如何处理已经被销毁的局部变量。

上一篇:3.1 DLL注入:常规远程线程注入
下一篇:没有了
网友评论