当前位置:首页 » 编程语言 » c语言memset头文件
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言memset头文件

发布时间: 2022-01-23 11:28:24

A. 求c语言memset的具体用法,什么时候必须用,什么时候可以不用以及可以用什么替换memset

memset函数使用详解
今天做题卡在MEMSET函数的使用上了,本来以为int a[100]; memset(a, MAX,sizeof(a));就是将a数组全部赋值为MAX,现在才知道他的填充是以字节为单位,一般用于对字符型变量的初值进行赋值.
更详细的解说见网络 --> http://ke..com/view/982208.htm
1。void *memset(void *s,int c,size_t n)
总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。
2。例子
#include
void main(){
char *s="Golden Global View";
clrscr();
memset(s,'G',6);
printf("%s",s);
getchar();
return 0;
}
3。memset() 函数常用于内存空间初始化。如:
char str[100];
memset(str,0,100);
4。memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;例:char a[100];memset(a, '/0', sizeof(a));
memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。
strcpy就只能拷贝字符串了,它遇到'/0'就结束拷贝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘/0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。
5.补充:一点心得
memset可以方便的清空一个结构类型的变量或数组。
如:
struct sample_struct
{
char csName[16];
int iSeq;
int iType;
};
对于变量
struct sample_strcut stTest;
一般情况下,清空stTest的方法:
stTest.csName[0]='/0';
stTest.iSeq=0;
stTest.iType=0;
用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct));
如果是数组:
struct sample_struct TEST[10];

memset(TEST,0,sizeof(struct sample_struct)*10);
6。strcpy
原型:extern char *strcpy(char *dest,char *src);
用法:#i nclude
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
memcpy
原型:extern void *memcpy(void *dest, void *src, unsigned int count);
用法:#i nclude
功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。
memset
原型:extern void *memset(void *buffer, int c, int count);
用法:#i nclude
功能:把buffer所指内存区域的前count个字节设置成字符c。
说明:返回指向buffer的指针。

B. C语言memset问题

首先你memset不能用来初始化int类型的内存,也不是不能,是你那么做了它也不会去按照你想的去初始化,除非你初始化值是0。原因是memset是按字节进行初始化的,举例,memset(pStart, 2, sizeof(int)); 一般sizeof(int)值是4,那么这个memset会将pStart开始的4个内存单元(4字节),每个字节都初始化成2。这样初始化之后,如果你要的是这个int类型的数值,那这个int值就是0x2020202,是这个值。这个和你做的那个初始化是类似的。
然后就是你使用memset的时候使用的是sizeof(data),因为data是一个指针,那么他的长度32位下永远都是4,所以你只初始化了4个字节,也就是只初始化了申请的第一个int单元,后面的两个都没有进行初始化。所以第一个int单元的值是0x2020202,也就是十进制的33686018,即你输出的第一个数,而后面的两个由于没有初始化都是以前的值,是随机的不可预测的。
个人觉得memset用来初始化的话一般都是用来将内存单元清0,想要初始化成一个具体的数值的话,除非你初始化的单元都是字节的,那样是可行的,其他的都很不方便。

C. c语言memset初始化结构体问题

1.memset函数的原型void *memset(void *s, char ch,size_tn);

函数的第一个形式参数是指针类型,所以实参因为一个地址,即&a

注意&a与a是不同的.a是结构体变量名,而&a是变量a的地址.

2.另外memset()是一个库函数函数,需要加头文件#include<string.h>

3.正如你所说的全局与主函数内定义变量a是有一点区别

源代码如下:

#include<stdio.h>
#include<string.h>

typedef struct ss
{
int num;
int dir[5][3];
}tent;

//tent a;

int main()
{
tent a;
printf("a=%p ",a); //输出的是变量的地址

printf("&a=%p ",&a);//注意a与&a的区别
memset(&a,0,sizeof(a));
return 0;
}

  1. 主函数内运行结果:

这个没警告的.

已上在VC6.0下的结果

为嘛第二个没警告,暂时不清楚.但第一个有警告是合理的.

D. c语言里有memset()怎么用需要什么头文件

包含在 <string.h>头文件中

memset为内存填充函数,可以用它对一片内存空间进行初始化, 它可以一字节一字节地把整个数组设置为一个指定的值
其原型为
void *memset(void *s, int v, size_t n);
这里s可以是数组名,也可以是指向某一内在空间的指针;
v为要填充的值;
n为要填充的字节数,通常为sizeof(s);
使用memset时要注意的是,memset是逐字节进行填充,所以s一般为char *型。

E. 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();

memset(s,'G',6);
printf("%s",s);

getchar();
return 0;
}

相关函数:bzero,setmem,strset

F. c语言中函数memset()是什么意思什么功能

memset()的函数, 它可以一字节一字节地把整个数组设置为一个指定的值。 memset()函数在mem.h头文件中声明,它把数组的起始地址作为其第一个参数,第二个参数是设置数组每个字节的值,第三个参数是数组的长度(字节数,不是元素个数)。其函数原型为:
void *memset(void*,int,unsigned);
其中void*表示地址
memset()的第一个实参是数组名,数组名作参数即数组作参数,它仅仅只是一个数组的起始地址而已。
实现第一个memset()函数调用的内存布局见图7-3。 在函数memset()栈区,从返回地址往上依次为第1,2,3个参数。第1个参数中的内容是main()函数中定义的数组ia1的起始地址。第2个参数是给数组设置的值(0),第3个参数是数组的长度(50*2)。函数返回时,main()函数的数组中内容全置为0。

G. c语言的memset到底是怎么实现的 是c标准库里面写的这样么

memset在不同编译器里面实现方式是不一样的

不过 都要比你提供的几种要复杂 而且高效。

有些平台甚至是用汇编写的。

提供几种做参考:

void*__cdeclmemset(
void*dst,
intval,
size_tcount
)
{
void*start=dst;

#ifdefined(_M_IA64)||defined(_M_AMD64)

{


__declspec(dllimport)


voidRtlFillMemory(void*,size_tcount,char);

RtlFillMemory(dst,count,(char)val);

}

#else/*defined(_M_IA64)||defined(_M_AMD64)*/
while(count--){
*(char*)dst=(char)val;
dst=(char*)dst+1;
}
#endif/*defined(_M_IA64)||defined(_M_AMD64)*/

return(start);
}
#include<linux/types.h>
#include<asm/string.h>

#defineOPSIZ(BITS_PER_LONG/8)
typedefunsignedlongop_t;

void*
memset(void*dstpp,intsc,size_tlen)
{
unsignedintc=sc;
longintdstp=(longint)dstpp;

if(len>=8)
{
size_txlen;
op_tcccc;

cccc=(unsignedchar)c;
cccc|=cccc<<8;
cccc|=cccc<<16;
if(OPSIZ>4)
/*.*/
cccc|=(cccc<<16)<<16;

/*Thereareatleastsomebytestoset.
NoneedtotestforLEN==0inthisalignmentloop.*/
while(dstp%OPSIZ!=0)
{
((unsignedchar*)dstp)[0]=c;
dstp+=1;
len-=1;
}

/*Write8`op_t'periterationuntillessthan8`op_t'remain.*/
xlen=len/(OPSIZ*8);
while(xlen>0)
{
((op_t*)dstp)[0]=cccc;
((op_t*)dstp)[1]=cccc;
((op_t*)dstp)[2]=cccc;
((op_t*)dstp)[3]=cccc;
((op_t*)dstp)[4]=cccc;
((op_t*)dstp)[5]=cccc;
((op_t*)dstp)[6]=cccc;
((op_t*)dstp)[7]=cccc;
dstp+=8*OPSIZ;
xlen-=1;
}
len%=OPSIZ*8;

/*Write1`op_t'.*/
xlen=len/OPSIZ;
while(xlen>0)
{
((op_t*)dstp)[0]=cccc;
dstp+=OPSIZ;
xlen-=1;
}
len%=OPSIZ;
}

/*Writethelastfewbytes.*/
while(len>0)
{
((unsignedchar*)dstp)[0]=c;
dstp+=1;
len-=1;
}

returndstpp;
}


CODESEG

extrn_VEC_memzero:near
extrn__sse2_available:dword

publicmemset
memsetproc
dst:ptrbyte,
value:byte,
count:dword

OPTIONPROLOGUE:NONE,EPILOGUE:NONE

.FPO(0,3,0,0,0,0)

movedx,[esp+0ch];edx="count"
movecx,[esp+4];ecxpointsto"dst"

testedx,edx;0?
jzshorttoend;ifso,nothingtodo

xoreax,eax
moval,[esp+8];thebyte"value"tobestored

;
testal,al;memsetusingzeroinitializer?
jnedword_align
cmpedx,0100h;blocksizeexceedssizethreshold?
jbdword_align
cmpDWORDPTR__sse2_available,0;SSE2supported?
jedword_align

jmp_VEC_memzero;usefastzeroSSE2implementation
;noreturn

;Alignaddressondwordboundary
dword_align:

pushedi;preserveedi
movedi,ecx;edi=destpointer

cmpedx,4;ifit'slessthen4bytes
jbtail;

negecx
andecx,3;ecx=#bytesbeforedwordboundary
jzshortdwords;jumpifaddressalreadyaligned

subedx,ecx;edx=adjustedcount(forlater)
adjust_loop:
mov[edi],al
addedi,1
subecx,1
jnzadjust_loop

dwords:
;setall4bytesofeaxto[value]
movecx,eax;ecx=0/0/0/value
shleax,8;eax=0/0/value/0

addeax,ecx;eax=0/0val/val

movecx,eax;ecx=0/0/val/val

shleax,10h;eax=val/val/0/0

addeax,ecx;eax=all4bytes=[value]

;Setdword-sizedblocks
movecx,edx;moveoriginalcounttoecx
andedx,3;prepareinedxbytecount(fortailloop)
shrecx,2;adjustecxtobedwordcount
jztail;jumpifitwaslessthen4bytes

repstosd
main_loop_tail:
testedx,edx;ifthereisnotailbytes,
jzfinish;wefinish,andit'stimetoleave
;Setremainingbytes

tail:
mov[edi],al;setremainingbytes
addedi,1

subedx,1;ifthereissomemorebytes
jnztail;continuetofillthem

;Done
finish:
moveax,[esp+8];returndestpointer
popedi;restoreedi

ret

toend:
moveax,[esp+4];returndestpointer

ret

memsetendp

end

H. C语言中memset函数是在哪个头文件中

string.h 和 memory.h中都有
这些头文件都是标准库中的

I. c语言malloc和memset

图1 你打印的是p的地址,而非输入的值。printf的时候改成*p打印值和输入值就一一致了,下面是测试图。

J. C语言编程有关memset函数

在你调用memset()函数时,第三个参数大小不对,应该是memset(b,0,40)。
实际上一个整型的变量在32位机的内存中占用4个字节
的大小。如:你可以定义一个整型变量a然后用:
printf("%d",sizeof(a));看到它在内存中占用的字节数。

当然建议在调用memset()函数时用sizeof()函数来自动
取它的大小,如你的例子中可以用:
memset(b,0,sizeof(b));