不完美的C –從《C陷阱和缺陷》說起 [外部類型檢查,庫函數,標識符名稱]

1.外部類型的檢查並不完美;/*exp 1:程式有源檔案a.c和源檔案b.c組成*//*源檔案a.c*/extern int n; //指明n是引用外部變數/*源檔案b.c*/long n; //指明的n的定義/*在這種情況下,C語言是不能檢測出這種錯誤的!*//*exp 2如果一個未聲明的標識符後面跟一個開括弧,預設視為傳回型別為整形*/main(){ double s; s = sqrt(2); printf("%d/n",s);}//這個錯誤已經修正了,如果未聲明,就報錯!   

一個由c/C++編譯的程式佔用的記憶體分為以下幾個部分

  一個由c/C++編譯的程式佔用的記憶體分為以下幾個部分   1、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變數的值等。其操作方式類似於資料結構中的棧。   2、堆區(heap) — 一般由程式員分配釋放, 若程式員不釋放,程式結束時可能由OS回收 。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鏈表。   3、全域區(靜態區)(static)—,全域變數和靜態變數的儲存是放在一塊的,初始化的全域變數和靜態變數在一塊地區,

ARP協議的c語言實現原始碼【轉載】

什麼是ARP協議英文原義:Address Resolution Protocol 中文釋義:(RFC-826)位址解析通訊協定 #include <netdb.h>#include <unistd.h>#include <ctype.h>#include <errno.h>#include <signal.h>#include <string.h>#include <stdio.h>#include

不完美的C –從《C陷阱和缺陷》說起 [可移植性缺陷]

1.記憶體位置 0    null 指標並不指向任何對象.當試圖去訪問一個NULL位置的值的時候,通常有下面這幾種情況:A.記憶體位置 0 強加了硬體級的保護,程式立即終止執行!B.記憶體位置 0 只允許讀,不允許寫;這樣,*str不過是垃圾資訊.C.記憶體位置 0 允許讀,也允許寫;這樣,錯誤的使用null指標,會造成致命傷害的!下面這個例子表明了你的機器是否允許讀/寫等;#include <stdio.h>#include <stdlib.h>void main(){

C語言函數access的應用

 access()是C語言中驗證檔案的一個函數,具體的函數原型,大家可以百度之,現在舉一個應用的例子。#include <stdio.h>#include <stdlib.h>#include <io.h>int main(int argc,char* argv[]){ char str[1024]; memset(str,0,1024+1); strcpy(str,"C:\\Programs"); if(access(str,0) !

不完美的C語言,從字元數組說起

先看兩個小程式/*Test A*/#include <stdio.h>#include <stdlib.h>int main(){ char str[5] = "abc"; //常量進行初始化 int i = 0; while(str[i] != '/0') {printf("%c",str[i]);i++; } return 0;}運行,輸出結果為:/*Test A

C語言裡面常用的時間日期函數總結

時間類型定義:       標頭檔:time.h            定義為:time_t     某些系統定義為 typedef long time_t 擷取時間函數:time_t time(time_t * timer);           time_t time_now;           time(&time_now); 輸出時間函數:char *ctime(const time_t *time);          

一種C程式記憶體越界調試方法

偶然在ChinaUnix上看到一篇關於程式調試的文章,裡面討論到了很多偵錯工具的方法,其中一個方法如下,覺得還不錯:          如果別人的程式裡malloc很多,不知道哪裡有記憶體越界,  那就把malloc, free重新定義掉,放在一個標頭檔裡,如mem.h  用gcc -include mem.h的方式重新編譯代碼,可以不修改別人的代碼來檢查記憶體問題。 (類似的,還要重定義strdup, realloc等函數)代碼如下:#define MAGIC_NUM 0x11121314 /

C裡面不容忽視的小細節

1. 三目運算子的恒等於符號的“副作用”#include <stdio.h>int main(int argc,char *argv[]){ int a = 1; int b = 2; int c = 3; a = b>c?b:c; //取bc二者最大值,無可厚非 a = 0?b:c; //取c的值 a = 1?b:c; //取b的值 a = b==c; //若b==c,則 a = 1;反正

C編程小技巧,持續更新ing

1.關於字串互轉如何??     一般來講,就是通過strlen(str)求出長度,設定中將temp,持續替換. 2.如何讓int型變數的位互換?    同樣的,但是這裡面控制長度迴圈的時候,有個技巧.     for(int i = 0; (i<sizeof(int))>>1; i++); //sizeof(int),適應多平台編程,而移位1,也就是除以2的意思,正好是迴圈的次數!   

C語言的設計原則

任何事物都不是憑空產生的,也不是一步就最佳化到位的! C語言也不例外,從一些C語言應用上面來看,有下面幾個原則: 1.空間佔用越小越好    C語言函數的傳參方式是拷貝一份參數,供程式主體使用;  因此,傳遞結構體就不如傳遞結構體指標;包括對聯合的設計,也是出於儘可能小的佔用空間;  還有就是記憶體對齊以及位域.  舉個例子,看看位域的情況:strcut CHAR { unsigned ch : 7; unsigned font : 6; unsigned size : 19

【老生常談】談談C語言中如何?的擷取可變參數列表的功能

在C語言中,是通過下面這三個函數來完成對可變參數列表值的讀取的。va_start(ap,fmt);vsprintf(info_buf,fmt,ap);va_end(ap);使用下面的代碼來示範一下。#include <stdio.h>#include <stdlib.h>#include <stdarg.h>int TestFunc(int Flag,const char *fmt,...){va_list ap;char

排序演算法的C語言實現

文章目錄 快速排序演算法

[轉帖]GNU C __attribute__ 機制簡介

摘要:在學習linux核心代碼及一些開源軟體的源碼(如:DirectFB),經常可以看到有關__attribute__的相關使用。本文結合自己的學習經曆,較為詳細的介紹了__attribute__相關文法及其使用。---------------------------------------------------------聲明:  此文為原創,歡迎轉載,轉載請保留如下資訊  作者:聶飛(afreez) 北京-中關村  連絡方式:afreez@sina.com (歡迎與作者交流) 

談談C中變數記憶體配置和釋放的原則

首先掌握幾個原則: 1. 誰使用,誰建立,誰釋放! 2. char *str1,str2[],str3[N] 使用時候的側重點! 一般來說,有如下幾種使用方式: A.先看這段代碼:int test(char *str1){ char *str;//定義,使用的時候需要分配記憶體,之後需要釋放記憶體 str = (char*)malloc(sizeof(char)*20); memset(str,0,sizeof(char)*20); str = str1;

C語言實現字串反轉的方法

C語言實現字串反轉,是C語言面試中比較常見的一個問題,這裡提供一種實現方法!供大家參考!折半替換法,即定義一頭一尾指標,同時向中間走,二者互換,相遇即為互換完畢!char *consver(char *str){char temp;char *s1 = str;char *s2 = str+strlen(str)-1; for(;s1 < s2;s1++,s2--){ temp = *s1;*s1 = *s2;*s2 = temp;}return

從一道題談C++中建構函式調用建構函式(像普通函數一樣調用建構函式)

題目如下:問下列代碼的列印結果為0嗎?#include <stdlib.h>#include <iostream>using namespace std;struct CLS{    int m_i;    CLS( int i ) : m_i(i){}    CLS()    {        CLS(0);    }};int main(){    CLS obj;    cout << obj.m_i << endl;    system("

C語言的記憶體管理

對於一個C語言程式而言,記憶體空間主要由五個部分組成程式碼片段(.text)、資料區段(.data)、BSS段(.bss),堆和棧組成,其中程式碼片段,資料區段和BSS段是編譯的時候由編譯器分配的,而堆和棧是程式啟動並執行時候由系統分配的。布局如下  在中,由編譯器分配的地址空間都是在串連的時候分配的,而運行時分配的空間是在程式運行時由系統分配的 BSS段:BSS段(bss segment)通常是指用來存放程式中未初始化的全域變數和靜態變數

C/C++中結構體(struct)知識點強化

 C/C++中結構體(struct)知識點強化為了進一部的學習結構體這一重要的知識點,我們今天來學習一下鏈表結構。    結構體可以看做是一種自訂的資料類型,它還有一個很重要的特性,就是結構體可以相互嵌套使用,但也是有條件的,結構體可以包含結構體指標,但絕對不能在結構體中包含結構體變數。   struct test    {          char name[10];          float socre;          test *next;    };//這樣是正確的!   

總頁數: 4314 1 .... 1438 1439 1440 1441 1442 .... 4314 Go to: 前往

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.