本文目錄一覽:
- 1、C語言中什麼是、、段錯誤、、引起段錯誤的原因有哪些?
- 2、學習C語言需要掌握哪些基本知識?
- 3、C語言 指針數組有關數組元素的內存地址指定問題
- 4、用C語言分配開闢內存問題
- 5、C語言怎麼在指定地址Addr處分配一段內存區域?
- 6、C語言中,定義一個指針的時候為這個指針開闢存儲空間嗎?
C語言中什麼是、、段錯誤、、引起段錯誤的原因有哪些?
在編程中以下幾類做法容易導致段錯誤,基本上是錯誤地使用指針引起的。所謂的段錯誤就是指訪問的內存超出了系統所給這個程序的內存空間,段錯誤應該就是訪問了不可訪問的內存,這個內存區要麼是不存在的,要麼是受到系統保護的。
段錯誤就是指訪問的內存超出了系統所給這個程序的內存空間,通常這個值是由gd tr來保存的,他是一個48位的寄存器,其中的32位是保存由它指向的 gdt表,後13位保存 相應於gdt的下標,最後3位包括了程序是否在內存中以及程序的在cpu中的運行級別,指向 的gdt是由以64位為一個單位的表,在這張表中就保存着程序運行的代碼段以及數據段的起 始地址以及與此相應的段限和頁面交換還有程序運行級別還有內存粒度等等的信息。
學習C語言需要掌握哪些基本知識?
1.入門程序
#include stdio.h
int main()
{
printf(“Hello World!”);
return 0;
}
2.數據類型
數據類型:
1.基本數據類型:
1.1. 整型:int 4個字節
1.2. 字符型:char 1個字節
1.3. 實型(浮點型)
1.3.1.單精度型:float 4個字節
1.3.2.雙精度型:double 8個字節
2.構造類型:
2.1.枚舉類型
2.2.數組類型
2.3.結構體類型
2.4.共用體類型
3.指針類型:
4.空類型:
3.格式化輸出語句
%d:十進制整數;
%c:單個字符;
%s:字符串;
%f:6位小數;
#include stdio.h
int main()
{
int age = 18;
float height = 1.85;
char unit = ‘m’;
printf(“小明今年%d歲\n”, age);
printf(“小明身高%f%c\n”, height, unit);
printf(“小明現在在慕課網上學習IT技術\n”);
return 0;
}
學好C++才是入職大廠的敲門磚! 當年要是有這課,我的C++也不至於這樣
已失效
4.常量
值不發生改變的量成為常量;
定義字符常量(注意後面沒有;)
#include stdio.h
#define POCKETMONEY 10 //定義常量及常量值
int main()
{
printf(“小明今天又得到%d元零花錢\n”, POCKETMONEY);
return 0;
}
5.運算符
5.1.算數運算符:+,-,*,/,%,++,–;前++/–,先運算,再取值.後++/–,先取值,再運算;
5.2.賦值運算符:
5.3.關係運算符;
5.4.邏輯運算符;
5.5.三目運算符:
表達式1 ? 表達式2 : 表達式3;
6.水仙花數計算
輸出所有三位數的水仙花數字
所謂“水仙花數”是指一個三位數,其各位數字立方和等於該數,如:153就是一個水仙花數,153=111+555+333。
#include stdio.h
int main()
{
//定義三位數num,個位數sd,十位數td,百位數hd
int num, sd, td, hd;
//循環所有三位數
for( num=100 ; num1000 ; num++ )
{
//獲取三位數字num百位上的數字
hd = num/100 ;
//獲取三位數字num十位上的數字
td = num/10%10 ;
//獲取三位數字num個位上的數字
sd = num%10 ;
//水仙花數的條件是什麼?
if(num ==hd*hd*hd+td*td*td+sd*sd*sd )
{
printf(“水仙花數字:%d\n”, num);
}
}
return 0;
}
7.打印正三角形的*
#include stdio.h
int main()
{
int i, j, k;
for(i=1; i5; i++)
{
/* 觀察每行的空格數量,補全循環條件 */
for( j=i ; j5 ; j++ )
{
printf(” “); //輸出空格
}
/* 觀察每行*號的數量,補全循環條件 */
for( k=0 ; k2*i-1 ; k++ )
{
printf(“*”); //每行輸出的*號
}
printf(“\n”); //每次循環換行
}
return 0;
}
8.臭名遠揚的goto語句
很少使用
#include stdio.h
int main()
{
int sum = 0;
int i;
for(i=1; i=10; i++)
{
printf(“%d\n”, i);
if(i==3){
goto LOOP;//滿足條件就執行goto語句
}
}
//執行goto
LOOP:printf(“結束for循環了….”); //請選擇合適位置添加標識符
return 0;
}
9.形參與實參
形參:形參是在定義函數名和函數體的時候使用的參數,目的是用來接收調用該函數時傳入的參數;
實參:實參是在調用時傳遞該函數的參數。
函數的形參和實參具有以下特點:
形參只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。因此,形參只有在函數內部有效。函數調用結束返回主調函數後則不能再使用該形參變量。
實參可以是常量、變量、表達式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須具有確定的值,以便把這些值傳送給形參。因此應預先用賦值等辦法使實參獲得確定值。
在參數傳遞時,實參和形參在數量上,類型上,順序上應嚴格一致,否則會發生類型不匹配”的錯誤。
10.函數返回值注意
注意:void函數中可以有執行代碼塊,但是不能有返回值,另void函數中如果有return語句,該語句只能起到結束函數運行的功能。其格式為:return;
11.遞歸
#include stdio.h
int getPeachNumber(int n) //這裡要定義n,要不編譯器會報錯!
{
int num;
if(n==10)
{
return 1;
}
else
{
num = (getPeachNumber(n+1)+1)*2;
printf(“第%d天所剩桃子%d個\n”, n, num);
}
return num;
}
int main()
{
int num = getPeachNumber(1);
printf(“猴子第一天摘了:%d個桃子。\n”, num);
return 0;
}
12.變量存儲類別 !
12.1.生存周期劃分存儲方式
C語言根據變量的生存周期來劃分,可以分為靜態存儲方式和動態存儲方式。
靜態存儲方式:是指在程序運行期間分配固定的存儲空間的方式。靜態存儲區中存放了在整個程序執行過程中都存在的變量,如全局變量。
動態存儲方式:是指在程序運行期間根據需要進行動態的分配存儲空間的方式。動態存儲區中存放的變量是根據程序運行的需要而建立和釋放的,通常包括:函數形式參數;自動變量;函數調用時的現場保護和返回地址等。
12.2.存儲類型劃分
C語言中存儲類別又分為四類:自動(auto)、靜態(static)、寄存器的(register)和外部的(extern) ;
用關鍵字auto定義的變量為自動變量,auto可以省略,auto不寫則隱含定為“自動存儲類別”,屬於動態存儲方式。
用static修飾的為靜態變量,如果定義在函數內部的,稱之為靜態局部變量;如果定義在函數外部,稱之為靜態外部變量。
注意:靜態局部變量屬於靜態存儲類別,在靜態存儲區內分配存儲單元,在程序整個運行期間都不釋放;靜態局部變量在編譯時賦初值,即只賦初值一次;如果在定義局部變量時不賦初值的話,則對靜態局部變量來說,編譯時自動賦初值0(對數值型變量)或空字符(對字符變量)
為了提高效率,C語言允許將局部變量的值放在CPU中的寄存器中,這種變量叫“寄存器變量”,用關鍵字register作聲明。
注意:只有局部自動變量和形式參數可以作為寄存器變量;一個計算機系統中的寄存器數目有限,不能定義任意多個寄存器變量;局部靜態變量不能定義為寄存器變量。
用extern聲明的的變量是外部變量,外部變量的意義是某函數可以調用在該函數之後定義的變量。
#includ stdio.h
//來源公眾號:C語言與CPP編程
int main()
{
//定義外部局部變量
extern int x;
return 0;
}
int x=100;
13.內部函數外部函數 !
在C語言中不能被其他源文件調用的函數稱為內部函數 ,內部函數由static關鍵字來定義,因此又被稱為靜態函數,形式為:
static [數據類型] 函數名([參數])
這裡的static是對函數的作用範圍的一個限定,限定該函數只能在其所處的源文件中使用,因此在不同文件中出現相同的函數名稱的內部函數是沒有問題的。
在C語言中能被其他源文件調用的函數稱為外部函數 ,外部函數由extern關鍵字來定義,形式為:
extern [數據類型] 函數名([參數])
C語言規定,在沒有指定函數的作用範圍時,系統會默認認為是外部函數,因此當需要定義外部函數時extern也可以省略。 extern可以省略; 14.數組 數組:一塊連續的,大小固定並且裡面的數據類型一致的內存空間, 數組的聲明:數據類型 數組名稱[長度n]
數據類型 數組名稱[長度n] = {元素1,元素2,元素3,……};
數據類型 數組名稱[] = {元素1,元素2,元素3,……};
數類類型 數組名稱[長度n]; 數組名稱[0] = 元素1;數組名稱[1] = 元素2;…… 注意: 1、數組的下標均以0開始; 2、數組在初始化的時候,數組內元素的個數不能大於聲明的數組長度; 3、如果採用第一種初始化方式,元素個數小於數組的長度時,多餘的數組元素初始化為0; 4、在聲明數組後沒有進行初始化的時候,靜態(static)和外部(extern)類型的數組元素初始化元素為0,自動(auto)類型的數組的元素初始化值不確定。
15.數組遍歷
#include stdio.h
int main()
{
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int i;
for(i=0;i10;i++)
{
printf(“%d\n”,arr[i]);
}
return 0;
}
數組的冒泡排序
冒泡排序的思想:相鄰元素兩兩比較,將較大的數字放在後面,直到將所有數字全部排序。
字符串與數組
在C語言中,是沒有辦法直接定義子字符串數據類型的,需使用數組來定義所要的字符串,形式如下:
char 字符串名稱[長度] = “字符串內容”;
char 字符串名稱[長度] = {‘字符串1′,’字符串2′,….,’字符串n’,’\0′};
注:
[]中的長度可以省略不寫;
採用第二種方式最後一個元素必須是’\0′,表示結束;
第二種方式不能寫中文!; 輸出字符串時,要使用:printf(“%s”,字符數組名);或puts(字符數組名);
16.字符串函數
strlen(s):獲取字符串s的長度;
strcmp(s1,s2):比較字符串;比較的時候會把字符串轉換成ASCII碼再進行比較,返回結果為0表示s1和s2的ASCII碼值相等,返回結果為1表示s1比s2的ASCII碼大,返回結果為-1表示s1比s2的ACSII碼小;
strcpy(s1,s2):字符串拷貝;s2會取代s1中的內容;
strcat(s1,s2)將s2拼接到s1後面;注意:s1的length要足夠才可以!
atoi(s1)將字符串轉為整數!
17.多維數組
數據類型 數組名稱[常量表達式1]…[常量表達式n];
多維數組的初始化與一維數組的初始化類似也是分兩種:
數據類型 數組名稱[常量表達式1][常量表達式2]…[常量表達式n] = {{值1,..,值n},{值1,..,值n},…,{值1,..,值n}};
數據類型 數組名稱[常量表達式1][常量表達式2]…[常量表達式n]; 數組名稱[下標1][下標2]…[下標n] = 值;
多維數組初始化要注意以下事項:
採用第一種始化時數組聲明必須指定列的維數。因為系統會根據數組中元素的總個數來分配空間,當知道元素總個數以及列的維數後,會直接計算出行的維數;
採用第二種初始化時數組聲明必須同時指定行和列的維數。
18.多維度數組的遍歷
使用嵌套循環
注意:多維數組的每一維下標均不能越界!
19.結構體
C 數組允許定義可存儲相同類型數據項的變量,結構是 C 編程中另一種用戶自定義的可用的數據類型,它允許您存儲不同類型的數據項。
結構用於表示一條記錄,假設您想要跟蹤圖書館中書本的動態,您可能需要跟蹤每本書的下列屬性:
Title
Author
Subject
Book ID
定義結構
為了定義結構,您必須使用 struct 語句。struct 語句定義了一個包含多個成員的新的數據類型,struct 語句的格式如下:
struct tag {
member-list
member-list
member-list
…
} variable-list ;
tag 是結構體標籤。
member-list 是標準的變量定義,比如 int i; 或者 float f,或者其他有效的變量定義。
variable-list 結構變量,定義在結構的末尾,最後一個分號之前,您可以指定一個或多個結構變量。下面是聲明 Book 結構的方式:
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} book;
在一般情況下,tag、member-list、variable-list 這 3 部分至少要出現 2 個。以下為實例:
//此聲明聲明了擁有3個成員的結構體,分別為整型的a,字符型的b和雙精度的c
//同時又聲明了結構體變量s1
//這個結構體並沒有標明其標籤
struct
{
int a;
char b;
double c;
} s1;
//此聲明聲明了擁有3個成員的結構體,分別為整型的a,字符型的b和雙精度的c
//結構體的標籤被命名為SIMPLE,沒有聲明變量
struct SIMPLE
{
int a;
char b;
double c;
};
//用SIMPLE標籤的結構體,另外聲明了變量t1、t2、t3
struct SIMPLE t1, t2[20], *t3;
//也可以用typedef創建新類型
typedef struct
{
int a;
char b;
double c;
} Simple2;
//現在可以用Simple2作為類型聲明新的結構體變量
Simple2 u1, u2[20], *u3;
訪問結構成員
為了訪問結構的成員,我們使用成員訪問運算符(.)。成員訪問運算符是結構變量名稱和我們要訪問的結構成員之間的一個句號。您可以使用 struct 關鍵字來定義結構類型的變量。下面的實例演示了結構的用法:
#include stdio.h
#include string.h
//來源公眾號:C語言與CPP編程
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main( )
{
struct Books Book1; /* 聲明 Book1,類型為 Books */
struct Books Book2; /* 聲明 Book2,類型為 Books */
/* Book1 詳述 */
strcpy( Book1.title, “C Programming”);
strcpy( Book1.author, “Nuha Ali”);
strcpy( Book1.subject, “C Programming Tutorial”);
Book1.book_id = 6495407;
/* Book2 詳述 */
strcpy( Book2.title, “Telecom Billing”);
strcpy( Book2.author, “Zara Ali”);
strcpy( Book2.subject, “Telecom Billing Tutorial”);
Book2.book_id = 6495700;
/* 輸出 Book1 信息 */
printf( “Book 1 title : %s\n”, Book1.title);
printf( “Book 1 author : %s\n”, Book1.author);
printf( “Book 1 subject : %s\n”, Book1.subject);
printf( “Book 1 book_id : %d\n”, Book1.book_id);
/* 輸出 Book2 信息 */
printf( “Book 2 title : %s\n”, Book2.title);
printf( “Book 2 author : %s\n”, Book2.author);
printf( “Book 2 subject : %s\n”, Book2.subject);
printf( “Book 2 book_id : %d\n”, Book2.book_id);
return 0;
}
學好C++才是入職大廠的敲門磚! 當年要是有這課,我的C++也不至於這樣
已失效
20.共用體
共用體是一種特殊的數據類型,允許您在相同的內存位置存儲不同的數據類型。您可以定義一個帶有多成員的共用體,但是任何時候只能有一個成員帶有值。共用體提供了一種使用相同的內存位置的有效方式。
#include stdio.h
#include string.h
union Data
{
int i;
float f;
char str[20];
};
int main( )
{
union Data data;
printf( “Memory size occupied by data : %d\n”, sizeof(data));
return 0;
}
21.指針
#include stdio.h
int main ()
{
int var = 20; /* 實際變量的聲明 */
int *ip; /* 指針變量的聲明 */
ip = var; /* 在指針變量中存儲 var 的地址 */
printf(“Address of var variable: %p\n”, var );
/* 在指針變量中存儲的地址 */
printf(“Address stored in ip variable: %p\n”, ip );
/* 使用指針訪問值 */
printf(“Value of *ip variable: %d\n”, *ip );
return 0;
}
22.文件讀寫
寫入文件
#include stdio.h
int main()
{
FILE *fp = NULL;
fp = fopen(“/tmp/test.txt”, “w+”);
fprintf(fp, “This is testing for fprintf…\n”);
fputs(“This is testing for fputs…\n”, fp);
fclose(fp);
}
讀取文件
#include stdio.h
int main()
{
FILE *fp = NULL;
char buff[255];
fp = fopen(“/tmp/test.txt”, “r”);
fscanf(fp, “%s”, buff);
printf(“1: %s\n”, buff );
fgets(buff, 255, (FILE*)fp);
printf(“2: %s\n”, buff );
fgets(buff, 255, (FILE*)fp);
printf(“3: %s\n”, buff );
fclose(fp);
}
C語言與C++學習路線
23.排序算法
十大經典排序算法(動態演示+代碼)
24.查找算法
九種查找算法
25.面試知識
C語言與C++面試知識總結
26.字符串操作
字符串操作的全面總結
27. C語言常用標準庫解讀
C語言常用標準庫解讀
28. C語言最常用的貪心算法
C語言最常用的貪心算法就這麼被攻克了
29. 常見的C語言內存錯誤及對策
常見的C語言內存錯誤及對策
30. C語言實現面向對象的原理
C語言實現面向對象的原理
31. C語言/C++內存管理
看完這篇你還能不懂C語言/C++內存管理?
32. 再談C語言指針
再談指針:大佬給你撥開 C 指針的雲霧
C語言函數指針之回調函數
C語言指針詳解(文末有福利)
33. C語言預處理命令
長文詳解:C語言預處理命令
34. C語言高效編程與代碼優化
C語言高效編程與代碼優化
35. C語言結構體
C語言之結構體就這樣被攻克了!值得收藏!
36. 原碼, 反碼, 補碼 詳解
原碼, 反碼, 補碼 詳解
37. C語言宏定義
簡述C語言宏定義的使用
38. c語言之共用體union、枚舉、大小端模式
c語言之共用體union、枚舉、大小端模式
C語言 指針數組有關數組元素的內存地址指定問題
看了一下,你的代碼邏輯上沒有問題。問題出在你選擇的0x1000000這個地址是系統保護的,不允許你寫入數據。給你個驗證辦法:你在主函數中寫一個int x;printf(“%x\n”,x);運行後會輸出一個16進制地址,用輸出的這個地址替換10000000就OK了。因為int x;這聲明的x在用戶變量區,那裡是允許寫入數據的……
用C語言分配開闢內存問題
針對你的問題補充我繼續回答:
你用new或malloc申請內存後,系統會為你分配在堆區的內存,系統會標記內存已經被佔用了,你在程序中不釋放,那麼在程序運行期間這些內存一直都被系統標記為只讀的,其他的程序不能使用,那麼這就叫做內存泄露。你的程序運行結束了,還保留着,直到電腦重啟了,內存初始化了,才會釋放,所以你可以知道內存泄露的危害了,在大型程序中,很可怕的。 至於你說任務管理器的內存也是一下就降下來了,那就涉及到進程的知識了
還有什麼不明白的,你可以繼續問……
==============================================================
這個問題才有意思
恩,我接着樓上的講吧 ,我說windows系統的
樓上的 memorymyann說的都對
定義的局部變量,在程序編譯的時候,編譯器會建立函數棧,然後局部變量存放於棧中,windows系統中,棧大小為2M ,其他樓上都說了
下一個:new和malloc()分配的空間都是在堆區,堆你就可以隨意申請了,系統會在系統空閑的鏈表中找出你要申請空間的大小,標誌為已經使用了,然後就會給你用 在申請空間後,注意檢測一下申請空間返會值,為NULL就是系統給你分配空間失敗了,用完了之後,你需要delete或free()掉你申請的,然後系統就會標記為沒有使用了
多看些內存管理的書也許對你的提高有好處
好好學習吧,兄弟……
C語言怎麼在指定地址Addr處分配一段內存區域?
或者讓特定的區不讓編譯器分配變量和常量,代碼,KEIL可以設定的,這樣強制使用它.
C語言中,定義一個指針的時候為這個指針開闢存儲空間嗎?
Int*p:第一級指針,表示p點所在地址是一個100Int類型的值,p被聲明為一個指向整數的指針,並且為這個指針分配了存儲空間。但在這種情況下,它是一個隨機數,我們稱之為指向一個不確定的內存地址。
當用戶說“direct*p=5”時,在一個不可預知的內存地址上寫入一個整數5。這是不允許的,並可能導致程序崩潰。
P = a;然後,將現有變量a的地址寫入指針p,我們說指向a的指針可以通過變量p對變量a進行正常操作。
擴展資料:
指針:
指針的表示法是地址,核心是指向關係的指針,操作符“*”的作用是根據關係訪問所指向的對象。如果版本與B有指向關係,則A為B的地址,“*A”表示通過該指向關係間接訪問B。
如果B的值是一個指針,它指向C,BC地址,間接訪問,CB“*”如果C是整數,真實的,或結構,如類型變量或數組元素對於這些類型的數據,BC(即地址)是通用的指針,即主要指的是右邊的針,持有一級指針變量指針變量。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/284549.html