开发者社区> 问答> 正文

C语言程序内存问题,标题太短晕……:报错


#include<stdio.h>
#include<string.h>
char* test(){
    char str[10];
    char* strp = str;
    strcpy(strp,"test");
    printf("%p\n",strp);
    return strp;
}
int main(){
    char *str;
    str = test();
    printf("%p,%s\n",str,str);
    str[0] = 'l';
    printf("%s\n",str);
    return 0;
}

代码如上,test函数返回了一个内存地址,而这段内存在test函数执行完毕之后就应该被“销毁”,但实际上在main函数中去读取这个内存,发现内容还在,并且还能对其修改。

我想问的是,这段内存中的内容是否是安全的?也就是其他函数在申请空间的时候会不会占用这里的内存,导致这块内存中的内容被改变



展开
收起
kun坤 2020-06-06 15:38:46 353 0
1 条回答
写回答
取消 提交回答
  • 看来LZ还的多了解下C的内存定义

    char* test()   返回str[10], str[10]是test的栈内存, 栈内存的工作范围就是当前函数即test,退出该函数后就不安全.

    str[0]  ='1' ;   对test()返回的栈内存进行操作那就更不安全了

    LZ所说内存可用是正常的, 在嵌入式上出问题的概率不高,在PC上出现概率要高(内存管理机制决定),但都可能存在以下问题:

    - 将别的有效数据删除了(导致系统数据错误或函数无法正常返回)

    - 写入的数据被其他操作覆盖了

    ######不安全的,这块内存可能在任何时候被重新使用,结果没法预料。######

    举个例子,大官视察民情,JC封路,路上留下了大官的车轮胎印子。

    大官走后,路解封.

    但是路上的大官留下的轮胎印子还在,你能看到。你的小破车过去,就把大官留下来的轮胎印子改变了。


    明白了?

    ######哈哈 有意思!######当你代码往下运行,调用别的函数,会覆盖这段栈内存,你再试试修改它######不安全,会出现不可预知的问题。。。######错误的用法就是不安全的######

    引用来自“四彩”的答案

    举个例子,大官视察民情,JC封路,路上留下了大官的车轮胎印子。

    大官走后,路解封.

    但是路上的大官留下的轮胎印子还在,你能看到。你的小破车过去,就把大官留下来的轮胎印子改变了。


    明白了?

    这比喻很精辟啊,不过现在和谐社会,不能封路的哦
    2020-06-06 15:38:52
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
内存取证与IaaS云平台恶意行 为的安全监控 立即下载
云服务器ECS内存增强型实例re6全新发布 立即下载
《15分钟打造你自己的小程序》 立即下载