C语言问题, memset()函数
#include<stdio.h>#include<stdlib.h>#include<string.h>intmain(){char*p1="name";char*p2...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *p1="name";
char *p2,*p3;
p3=p2=(char*)malloc(20);
memset (p2, 0, 20);
while(*p2++ = *p1++);
printf("%s\n",p3);
free(p3);
return 0;
}
我有以下几个问题,1.为什么要多设一个p3指针
2.为什么 memset (p2, 0, 40);在40以前都显示"name"再报错,而搞成 memset (p2, 0, 41);在41以后就不显示name直接报错? 展开
#include <stdlib.h>
#include <string.h>
int main()
{
char *p1="name";
char *p2,*p3;
p3=p2=(char*)malloc(20);
memset (p2, 0, 20);
while(*p2++ = *p1++);
printf("%s\n",p3);
free(p3);
return 0;
}
我有以下几个问题,1.为什么要多设一个p3指针
2.为什么 memset (p2, 0, 40);在40以前都显示"name"再报错,而搞成 memset (p2, 0, 41);在41以后就不显示name直接报错? 展开
展开全部
P3指向开辟的20个字节的空间的首地址
而P2初始值等于P3,然后不断++,指针一直向后移动
如果不加P2,而直接用P3 ++,printf("%s\n",p3);这句的P3就错了,因为P3已经不是首地址了
至于你说的40以前先输出name再报错,40以后直接报错,那是因为:
后面的20个字节刚好是尚未分配的内存,你对尚未分配的内存进行置0操作,虽然错误,但不会造成严重后果,所以先输出name再报错
超过20个字节以后,刚好是已分配的内存,存有数据,你要进行置0操作,系统当然不允许了,直接出错。
你说的40 41 是不确定的,在不同时候,值可能不同。
但是因为系统的内存4个字节对齐的缘故,
必然是4n 4n+1 n为整数 如36 32 28先输出name再报错
37 33 29直接报错
补充一点:你如果把free这句注释掉就不会报错,但是每运行一次就有一块内存被占用而没被使用
而P2初始值等于P3,然后不断++,指针一直向后移动
如果不加P2,而直接用P3 ++,printf("%s\n",p3);这句的P3就错了,因为P3已经不是首地址了
至于你说的40以前先输出name再报错,40以后直接报错,那是因为:
后面的20个字节刚好是尚未分配的内存,你对尚未分配的内存进行置0操作,虽然错误,但不会造成严重后果,所以先输出name再报错
超过20个字节以后,刚好是已分配的内存,存有数据,你要进行置0操作,系统当然不允许了,直接出错。
你说的40 41 是不确定的,在不同时候,值可能不同。
但是因为系统的内存4个字节对齐的缘故,
必然是4n 4n+1 n为整数 如36 32 28先输出name再报错
37 33 29直接报错
补充一点:你如果把free这句注释掉就不会报错,但是每运行一次就有一块内存被占用而没被使用
展开全部
1:P3指针是保存P2的初始值的,P2后面有++,所以先保存开头的字符串的地址。
2、3:原因不太清楚,因为只有20字节的空间是有效的,而对大于20字节的地址进行操作,错误可能不能预料。
2、3:原因不太清楚,因为只有20字节的空间是有效的,而对大于20字节的地址进行操作,错误可能不能预料。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.设置p3的用意:while循环之后p2指针后移,如果我们printf p2那么它的值是不可预测的也就是乱码。
2.memset的作用是把指定的内存写入指定数量的指定的值。
memset(p2,0,40); 作用就是把从p2指针起始地址开始的40个字节写成0也就是空;
但前面我们用malloc只分配了20个字节空间,那么后面20个地址有没有数据是不确定的
因此只要这里面的值大于20都有可能出现错误。
2.memset的作用是把指定的内存写入指定数量的指定的值。
memset(p2,0,40); 作用就是把从p2指针起始地址开始的40个字节写成0也就是空;
但前面我们用malloc只分配了20个字节空间,那么后面20个地址有没有数据是不确定的
因此只要这里面的值大于20都有可能出现错误。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-02-12
展开全部
//将程序改成下面这样,你就会明白的。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *p1="name";
char *p2,*p3;
p3=p2=(char*)malloc(20);//分配20字节的空间;
memset (p2, 'A', 10);//前10个字节放入'A'
p2+=10;
while(*p2++ = *p1++);//"AAAAAAAAAA"后接"name"
printf("%s\n",p3);
free(p3);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *p1="name";
char *p2,*p3;
p3=p2=(char*)malloc(20);//分配20字节的空间;
memset (p2, 'A', 10);//前10个字节放入'A'
p2+=10;
while(*p2++ = *p1++);//"AAAAAAAAAA"后接"name"
printf("%s\n",p3);
free(p3);
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询