| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 436 人关注过本帖
标题:奇怪的内存访问违规问题
只看楼主 加入收藏
pusheax
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-9-12
结帖率:0
收藏
已结贴  问题点数:20 回复次数:4 
奇怪的内存访问违规问题
#define RD_LEN 12

char* rd_str()
{


char str[RD_LEN];

int i;


srand(time(NULL));

    for(i=0;i<RD_LEN;++i)
        str='A'+rand()%26;
    str[++i]='\0';
    return str;
}

然后再另外一个函数中进行调用

const char* GetRDStr()
{

char* str=(char*)malloc(sizeof(char)*(RD_LEN+1));

str=rd_str();
//1

strcpy(str,rd_str());
//2



return str;

}

现在遇到的问题是 不管用1还是2的方式来获取函数的返回值 都报出 内存访问Access Violation的错误
代码要怎么改写?
搜索更多相关主题的帖子: 内存 
2012-09-12 10:47
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
char str[RD_LEN];

return str;

后面不用看了 你返回了栈内存还说【奇怪】 一点也不奇怪 能正常运行才奇怪呢
2012-09-12 10:48
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:7 
一般情况下 如果要在函数里面对数组等东西进行操作 有两种最基本的实现方法

一种是在调用前把这个数组准备好 传指针 在函数里操作
一种是在函数里面分配

在函数里面用char aa[50] = {0};这样弄出来还返回的 99.99% 的情况下有问题 我没说死是因为某些时候这个可能有特殊用处 但你这里明显不是
2012-09-12 10:53
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:7 
楼主可以传指针啊,就像z版说的,str[RD_LEN]只是一个局部变量,存储在栈区,函数调用完就销毁了,根本不能作为返回值来使用的
可以看下这里https://bbs.bccn.net/viewthread.php?tid=378639&page=1#pid2141165
程序代码:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <string>
using namespace std;

#define RD_LEN 12

char* rd_str(char * str,int len=RD_LEN)
{
    int i;
    srand(time(NULL));
    for(i=0;i<len;++i)
        *(str+i)='A'+rand()%26;
    str[i]='\0';
    return str;
}

char* GetRDStr()
{
    char* str=(char*)malloc(sizeof(char)*(RD_LEN+1));
//    str=rd_str(str);
    //1
    strcpy(str,rd_str(str));
    //2
    return str;
}

int main()
{
    char *str=NULL;
    str=GetRDStr();
    printf("%s",str);
    free(str);
    getch();
    return 0;
}


[ 本帖最后由 stophin 于 2012-9-13 10:57 编辑 ]
2012-09-13 10:54
hrc2010a
Rank: 2
等 级:论坛游民
帖 子:16
专家分:55
注 册:2012-9-12
收藏
得分:7 
一个知识点!!!!你反回的是一个局部变量的地址!!!!当这个变量所在的函数退出时虽然还在栈内但随时有函数压栈,当有别的函数压栈时你的这个变量随时会被复盖!!!所以返回一个局部变量是十分危险的!!
如果你确实需要返回一个指针的话可以用char *str = (char *)malloc(长度),或定义一个全局指针。
2012-09-13 21:47
快速回复:奇怪的内存访问违规问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024469 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved