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;
}
主函數內運行結果:
這個沒警告的.
已上在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));