2019年3月14日 星期四

[C語言] 動態記憶體配置


C語言上有遇到動態記憶體配置問題


  說明直接放在下方! 


Q1:為何在下述程式內, 配置二維陣列的記憶體後, 執行出來的陣列位址每換一列都不是加4 byte.
例如:
3x3:
&arr[0][2]=00BD3200 --> &arr[1][0]=00BD3210 差10 Bytes
arr[0]=00BD31F8, arr[1]=00BD3210差18.
但若不做記憶體 配置 , 則3x3,nxn每個都是4 bytes.

Q2:為何做記憶體配置和沒有做配置, arr+n的address和arr[n]有差異?
ex:



做記憶體配置>> 取arr+n的值不會等於arr[n]的值. 且arr+0,arr+1差4 byte. arr[0],arr[1]差18.
arr+0=00BD31E0; arr[0]=00BD31F8
arr+1=00BD31E4; arr[1]=00BD3210

  
不做記憶體配置>> 取arr+n的值會等於arr[n]的值. 且arr+0,arr+1差12 byte. 剛好是3x4 byte.
arr+0=0060FE8C; arr[0]=0060FE8C; &arr[0]=0060FE8C;
arr+1=0060FE98; arr[1]=0060FE98; &arr[1]=0060FE98;
arr+2=0060FEA4; arr[2]=0060FEA4; &arr[2]=0060FEA4;

int main()
{
    int i,j,n;
    int count=0;

   printf("Input the size:");
   scanf("%d", &n);
   int **arr=(int **)malloc(n*sizeof(int *));
      for(i=0;i<n;i++)
        arr[i]=(int *)malloc(n*sizeof(int));


      for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        {
         arr[i][j]=count;
         count++;
        }

      printf("arr+0=%p; arr[0]=%p; *arr[0]=%d; *(arr+0)=%p; &arr[0][2]=%p\n",arr+0, arr[0], *arr[0], *(arr+0), &arr[0][2]);
      printf("arr+1=%p; arr[1]=%p; *arr[1]=%d; *(arr+1)=%p; &arr[1][0]=%p\n",arr+1, arr[1], *arr[1], *(arr+1), &arr[1][0]);
      printf("arr+2=%p; arr[2]=%p; *arr[2]=%d; *(arr+2)=%p; &arr[2][0]=%p\n",arr+2, arr[2], *arr[2], *(arr+2), &arr[2][0]);
      for(i=0;i<n;i++)
        free(arr[i]);
      free(arr);
    return 0;
}

結果:
arr+0=00BD31E0; arr[0]=00BD31F8; *arr[0]=0; *(arr+0)=00BD31F8; &arr[0][2]=00BD3200
arr+1=00BD31E4; arr[1]=00BD3210; *arr[1]=3; *(arr+1)=00BD3210; &arr[1][0]=00BD3210
arr+2=00BD31E8; arr[2]=00BD3228; *arr[2]=6; *(arr+2)=00BD3228; &arr[2][0]=00BD3228


===========================


From 艾鍗C程式設計講義 


 動態配置2維空間


如果想要像int arr[n][n],配置一段連續的nxn空間,可以用這樣的方式來宣告指標, n-int pointer

 printf("Input the size:");
   scanf("%d", &n);

   int (*arr)[n]=(int *)malloc(n*n*sizeof(int));
   
printf("%d\n",sizeof(arr));  // 4 byte

      for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        {
         arr[i][j]=count;
         count++;
        }
     show(n,*arr);


        free(arr);


參考:




2019年3月3日 星期日

HTTP 的訊息格式處理



HTTP  的訊息格式 (Text Format) 大致如下: 

Method     URL   Protocol \r\n          
key: value  \r\n
key: value  \r\n
key: value  \r\n
\r\n
HTML data

例如




HTTP Header 訊息每列以 \n 或 \r\n 換行, 若某一行為\\r\n 或 \n 沒有任何字 表示Header結尾。 訊息中也可能包含不定數量的空白(依程式實作者而定)

底下利用C函式的字串處理函數strpbrk(), strspn() 進行字串解析, 抓到你想要的欄位值。

protocol -->  "HTTP/1.1"
Method-->  "GET"
URL-->  "/doc/test.html"
Host--< www.test101.com
...






strpbrk()

  int len;
   const char str1[] = "ABCDEFG019874";
   const char str2[] = "BCD";

   char *str = strpbkr(str1, str2)   ==> str="BCDEFG019874"


 strspn()



   int len;
   const char str1[] = "ABCDEFG019874";
   const char str2[] = "ABCD";

   len = strspn(str1, str2)   ==> len=4


相關課程: