本文目錄一覽:
關於C語言中柔性數組內存釋放問題
首先,結構體里char * cpArr[0];的意思是分配0個為char *元素的數組,其實就是不分配,所以sizeof (struct testStruct)的值是4
然後,sizeof (struct testStruct) + 3 * sizeof (char *)表示的其實就是4個char*指針所佔用的內存空間,也就是4個struct testStruct結構體所佔用的內存空間。
這樣看來,指針t應該指向的是一個有4個struct testStruct元素的結構體,理論上應該不會導致內存泄漏。
這段代碼的大概目的就是打算讓struct testStruct結構體的cpArr數組可以有多個,且個數不確定的元素。雖然編譯器沒有給出警告,但這樣的代碼是一個很不好的代碼——不但降低了可讀性,也降低了可靠性。如果你想建立一個struct testStruct結構體的數組,如果直接使用struct testStruct * t = (struct testStruct *) malloc (2*(sizeof (struct testStruct) + 3 * sizeof (char *)));分配內存,那麼t[1]-cpArr[0]和t[0]-cpArr[1]將代表同一個值。
建議使用
struct testStruct * t = (struct testStruct *) malloc (sizeof (struct testStruct));
t-cpArr=(char**)malloc(3*sizeof(char*));
來分配內存,使用
free (t-cpArr);
free (t);
來釋放內存,char**的意思就是指向char*的指針,為了建立一個char*指針的數組,即字元串數組。而使用時還可以使用t-cpArr[0]、t-cpArr[1]、t-cpArr[2]來表示。即這個程序的代碼可以改成
#includestdio.h
#includestdlib.h
struct testStruct
{
char * c;
char ** cpArr;
};
int main (void)
{
struct testStruct * t = (struct testStruct *) malloc (sizeof (struct testStruct));
t-cpArr=(char**)malloc(3*sizeof(char*));
t-cpArr[0] = “This”;
t-cpArr[1] = “is a”;
t-cpArr[2] = “test.”;
printf (“%s %s %s\n”, t-cpArr[0], t-cpArr[1], t-cpArr[2]);
free (t-cpArr);
free (t);
return 0;
}
這樣雖然多佔了一個char**指針的空間,但會大大增強程序的可讀性和可靠性,就不會有問題了。
C語言指針的用法是什麼?
指針是C語言中廣泛使用的一種數據類型。運用指針編程是C語言最主要的風格之一。
利用指針變數可以表示各種數據結構;能很方便地使用數組和字元串;並能象彙編語言一樣處理內存地址,從而編出精練而高效的程序。指針極大地豐富了C語言的功能。
學習指針是學習C語言中最重要的一環,能否正確理解和使用指針是我們是否掌握C語言的一個標誌。
同時,指針也是C語言中最為困難的一部分,在學習中除了要正確理解基本概念,還必須要多編程,上機調試。只要作到這些,指針也是不難掌握的。
C語言實驗 關於指針的!!
#include stdio.h
#includestdlib.h
#includestring.h /*頭文件*/
int find(char srt[],char xCh); /*函數要聲明*/
void main() /*main()不是這樣寫吧*/
{
int cs; /*i時什麼東西*/
char a,k[100]; /*char a,k;字元串數組不是這樣聲明*/
/*int find(char srt,char xCh);這個放到上面聲明*/
/*clrscr();這個有什麼用?*/
printf(“input a char\n”);
scanf(“%c”,a); /*scanf(“%s”,a);錯*/
printf(“input a find\n”);
scanf(“%s”,k);
cs=find(k,a); /*cs=find(a,k);*/
printf(“%d\n”,cs);
}
int find(char srt[],char xCh) /*int findchar srt,char xCh要用()這個,不能用還有錯誤自己對照*/
{
int j,cs=0,len=strlen(srt);
char*p; /* int *p;*/
p=srt;
/*下面這部分自己看,和你自己的對照一下*/
for(j=0;jlen;j++)
{
if(*(p+j)==xCh)
{
cs++;
printf(“%d \n”,j);} }
/*這個幹嗎用?*/
return(cs);
}
/*改了我好長時間,給分啊~~~*/
關於C語言中的指針。。
#include”stdio.h”
#include”stdlib.h”
#include”string.h”
int main()
{
char *src=”hello,world”;
int len=strlen(src);
int i;
char *dest=(char*)malloc(len+1);
if(dest==NULL)
{
printf(“dest is NULL!\n”);
return 0;
}
//錯誤在這,你的dest指針變數,已經在循環中發生改變
//由於要釋放動態分配的空間,最好不要修改這個空間的接收指針
//src=src+len-1;
//while(–len!=0)
//*dest++=*src–;
//*dest=0;
for(i=0;ilen;i++)
*(dest+i)=*(src+len-1-i);
*(dest+i)=0;
printf(“%s\n”,dest);
free(dest);
return 0;
}
結果:
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/186046.html