內存釋放

markdown

棧區(stack)—由編譯器本身主動分配釋放,存放函數的參數值。局部變量的值等。

其操做方式類似於數據結構中的棧。 堆區(heap)—通常由程序猿分配釋放。若程序猿不釋放。程序結束時可能由OS回收。注意它與數據結構中的堆是兩回事,分配方式卻是類似於鏈表 全局區(靜態區)(static)—全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域。未初始化的全局變量和未初始化的靜態   變量在相鄰的還有一塊區域。 程序結束後由系統釋放。 常量區—常量字符串就是放在這裏的。直到程序結束後由系統釋放。上面的問題就在這裏!!php

! 代碼區—存放函數體的二進制代碼。

直接搬運的代碼數據結構

//main.cpp
int a = 0; //全局初始化區
char *p1; //全局未初始化區app

main()
{
int b; //棧
char s[] = 「abc」; //棧
char *p2; //棧
char *p3 = 「123456」; //123456\0在常量區,p3在棧上。
static int c =0;//全局(靜態)初始化區
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);//分配得來得10和20字節的區域就在堆區。
strcpy(p1, 「123456」); //123456\0放在常量區。編譯器可能會將它與p3所指向的」123456」優化成一個地方。
} socket

複製代碼tcp

此外,還有realloc(又一次分配內存)、calloc(初始化爲0)、alloca(在棧上申請內存,本身主動釋放)等。函數

http://blog.csdn.net/xukai871105/article/details/17485349post

char remote_server[] = 「192.168.1.106」; // 主機IP地址或主機域名
char remote_path[] = 「/add.php」; // 文件地址
int value1 = 10;
int value2 = 20;
void tcpclient(const char* host_name, int port)
{
(void)port;
(void)host_name;優化

int sock, bytes_received;

// HTTP請求和HTTP響應 緩衝區
char* http_request = rt_malloc(256);
if (http_request== RT_NULL)
{
    rt_kprintf("No memory\r\n");return;
}
char* http_response = rt_malloc(512);
if (http_response == RT_NULL)
{
    rt_kprintf("No memory\r\n");return;
}

struct hostent *remote_host;
remote_host = gethostbyname(remote_server);
if( remote_host == NULL )
{
    rt_kprintf("DNS Failed\r\n");return;
}

struct sockaddr_in remote_sockaddr;
remote_sockaddr.sin_family = AF_INET;
remote_sockaddr.sin_port = htons(80);
// remote_sockaddr.sin_addr.s_addr = inet_addr("192.168.1.106");
remote_sockaddr.sin_addr.s_addr =
                            *(unsigned long *)remote_host->h_addr_list[0];
rt_memset(&(remote_sockaddr.sin_zero), 0, sizeof(remote_sockaddr.sin_zero));

while(1)
{
    // 第二步 建立套接字
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        rt_kprintf("Socket error\n");
        return;
    }

    // 第三步 鏈接remote
    if (connect(sock, (struct sockaddr *)&remote_sockaddr, sizeof(struct sockaddr)) == -1)
    {
        rt_kprintf("Connect fail!\n");
        lwip_close(sock);
        return;
    }

    // Http內容,表單內容
    char http_content[64] = {0,};
    // 肯定HTTP表單提交內容
    sprintf( http_content , "value1=%d&value2=%d" , value1,value2);

    // 肯定 HTTP請求首部 好比POST /add.php HTTP/1.1\r\n
    char http_header[64] = {0,};
    sprintf( http_header , "POST %s HTTP/1.1\r\n",remote_path);
    strcpy( http_request , http_header ); // 拷貝到請求緩衝區中

    // Http屬性
    char http_attribute[64] = {0,};
    // 添加屬性 好比 Host:192.168.1.106\r\n
    sprintf( http_attribute , "Host:%s\r\n" , remote_server);
    strcat( http_request , http_attribute);
    memset( http_attribute , 0 , sizeof(http_attribute));

    // 添加提交表單內容的長度 好比 Content-Length:19\r\n
    sprintf( http_attribute , "Content-Length:%d\r\n" ,strlen(http_content) );
    strcat( http_request , http_attribute);
    memset( http_attribute , 0 , sizeof(http_attribute));

    // 添加表單編碼格式 Content-Type:application/x-www-form-urlencoded\r\n
    strcat( http_request , "Content-Type:application/x-www-form-urlencoded\r\n");
    memset( http_attribute , 0 , sizeof(http_attribute));

    // HTTP首部和HTTP內容 分隔部分
    strcat( http_request , "\r\n");

    // HTTP負載內容
    strcat( http_request , http_content);

    // 發送Http請求
    send(sock,http_request,strlen(http_request), 0);

    // 得到Http響應
    bytes_received = recv(sock, http_response, 1024 - 1, 0);
    http_response[bytes_received] = '\0';

    // 分析和輸出結果
    char* presult = strstr( http_response , "\r\n\r\n");
    int result_value = atoi( presult + strlen("\r\n\r\n") );
    // value1和value2累加
    rt_kprintf("value1:%d value2:%d result:%d\r\n" ,
               value1++, value2++,result_value );

    rt_memset(http_response , 0 , sizeof(http_response));

    // 關閉套接字
    closesocket(sock);

    // 延時5S以後又一次鏈接
    rt_thread_delay( RT_TICK_PER_SECOND * 10 );
}

}編碼