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 ); }
}編碼