C语言问题, memset()函数

#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直接报错?

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这句注释掉就不会报错,但是每运行一次就有一块内存被占用而没被使用
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-02-12
1:P3指针是保存P2的初始值的,P2后面有++,所以先保存开头的字符串的地址。
2、3:原因不太清楚,因为只有20字节的空间是有效的,而对大于20字节的地址进行操作,错误可能不能预料。
第2个回答  2011-02-12
1.设置p3的用意:while循环之后p2指针后移,如果我们printf p2那么它的值是不可预测的也就是乱码。
2.memset的作用是把指定的内存写入指定数量的指定的值。
memset(p2,0,40); 作用就是把从p2指针起始地址开始的40个字节写成0也就是空;
但前面我们用malloc只分配了20个字节空间,那么后面20个地址有没有数据是不确定的
因此只要这里面的值大于20都有可能出现错误。
第3个回答  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;
}

c语言memset()函数怎么使用
1.int arr[10]={0};如果只对数组的一部分进行初始化,则编译器将把其他元素设置为0。因此,当只将第一个元素初始化为0时,编译器会自动将其他元素设为0 (就像前一句说的那样)。2.int arr[31]={};3.用memset函数在程序开始时初始化数组。比如:int arr[1024];memset(arr, 0, 1024); \/\/...

c语言memset()函数简单问题
人家把个数设置成strlen(buffer) - 1是为了让你能更清楚的看到memset函数的作用,当然吧个数改成strlen(buffer)也没错,结果就全是'*'了嘛。

c语言中函数memset()是什么意思?什么功能
memset()的函数, 它可以一字节一字节地把整个数组设置为一个指定的值。 memset()函数在mem.h头文件中声明,它把数组的起始地址作为其第一个参数,第二个参数是设置数组每个字节的值,第三个参数是数组的长度(字节数,不是元素个数)。其函数原型为:void *memset(void*,int,unsigned);其中void*...

c语言中,memset() 这个函数做什么用?请给出实例。
这个函数可以说是用来清理内存内容的,比如 你声明一个变长的数组 printf("请输入数组的长度:");scanf("%d",&n);char arr[n];因为此处的数组变长 所以不能初始化 数组的里面存着一堆随机数,而你却需要将这个数组清空时就可以使用这个函数 例如menset(arr,0,20)---将数组arr的前20个清空...

memset函数及其用法,C语言memset函数详解
memset() 函数是用于初始化内存的工具。它的原型为:void *memset(void *s, int c, size_t n)。其中,s 是要初始化的内存区域首地址,c 是要填充的值,n 是要填充的字节数。此函数将s所指向的n个字节内存用整型值c填充。memset() 的用途主要是给内存块填充特定值,比如数组或结构体。由于它...

在C语言中函数memset()是干什么用的?
memset 原型:extern void *memset(void *buffer, int c, int count);用法:#include <string.h> 功能:把buffer所指内存区域的前count个字节设置成字符c。说明:返回指向buffer的指针。举例:\/\/ memset.c include <syslib.h> include <string.h> main(){ char *s="Golden Global View";clrscr(...

c语言里有memset()怎么用?需要什么头文件?
memset为内存填充函数,可以用它对一片内存空间进行初始化, 它可以一字节一字节地把整个数组设置为一个指定的值 其原型为 void *memset(void *s, int v, size_t n);这里s可以是数组名,也可以是指向某一内在空间的指针;v为要填充的值;n为要填充的字节数,通常为sizeof(s);使用memset时要...

c语言memset初始化结构体问题
调用memset函数需要#include <string.h> memset的第一个参数为一个指针,因此你需要memset(&a, 0, sizeof(a))这样去操作 memset的具体使用你可以通过在命令行输入:man memset来查看。全局变量和局部变量时都可以的。代码见下:include<stdio.h>#include <string.h>typedef struct ss{ int num;...

LINUX下C语言的一个小问题(memset 函数)
memset((void *)&(server_address.sin_zero), 0, sizeof(server_address.sin_zero));参数不一致

这段三级C语言的程序里的第6排的“memset(str,0,80);”是什么意思?
memset() 函数常用于内存空间初始化。如: char str[100]; memset(str,0,100); memset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘\\0’;例:char a[100];memset(a, '\\0', sizeof(a)); memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,...

相似回答
大家正在搜