OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5429|回复: 4

请教内存一个标准库函数问题~

[复制链接]

11

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2011-8-18
在线时间
0 小时
发表于 2012-4-10 10:51:01 | 显示全部楼层 |阅读模式

#include<stdio.h>
#include<stdlib.h>

int main(void)
{
 char* p1 = "abcdef";
 char* p2 = (char*)malloc(10*sizeof(char));
 char* p3;
 if(p2 == NULL)
 {
  printf("malloc failed!");
 }
 p3 = memcpy(p2,p1,10);
 printf("%s  %s  %s\n",p1,p2,p3); 
 memset(p2,'m',3);
 printf("%s\n",p2);
 memset(p3,'m',3);
 printf("%s\n",p3);
 memset(p1,'m',3);
 printf("%s\n",p1);

 free(p2);
 p2 = NULL;

 return 0;
}

在VS2008下编译这个程序可以通过,但是运行的时候,会报错该内存不能“written”,程序断在了 memset(p1,'m',3);这句话,我想知道这个函数为什么不能直接作用字符串指针?但是指针p2,p3调用过malloc函数的就可以正常的替换并输出呢?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2012-4-10 11:55:03 | 显示全部楼层
回复【楼主位】神之箭:
---------------------------------
因为P1没有申请过内存.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

11

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2011-8-18
在线时间
0 小时
 楼主| 发表于 2012-4-10 14:20:54 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,char* p1 = "abcdef"; 这句话难道不是将字符串"abcdef"的首地址传递给了指针p1吗?这样p1指向了字符串,这不算是p1申请内存的过程吗?有点糊涂了,望指点下
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2012-4-10 22:38:44 | 显示全部楼层
回复【3楼】神之箭:
---------------------------------
是的
仅仅是把字符串的首地址传送给p1,并没有申请任何内存.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2012-6-29
在线时间
0 小时
发表于 2012-6-29 15:54:23 | 显示全部楼层

char* p1 = "abcdef";

p1是指针,但是所指的字串"abcdef"(是程序的一部分)被存放在内存的系统区,只允许读操作,不允许写入,否则程序本身就遭到破坏。而p2,p3指向程序申请的内存,它们从内存的“堆”中分配,由程序使用,所以可以写入。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-9 01:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表