1. 程式人生 > >c::關於strcpy的幾道經典的面試題~

c::關於strcpy的幾道經典的面試題~

試題1:

void test1()
{
	char str1[10];
	char* str2 = "0123456789";
	strcpy(str1,str2);
}

【說明】:

1)str2要賦值到str1中,str2的大小是11要加上末尾的'\0',而str1的大小是10,陣列會發生越界

2)它具體的賦值是str2從記憶體的起始地址開始進行賦值,賦值到str2的位元組數具有不確定性

3)指出庫函式strcpy的工作方式,即如何模擬一個strcpy(這個在我的上篇部落格裡有寫,大家可以去看看)

試題2:

void test2()
{
	char str1[10],str2[10];
	int i = 0;
	for(i = 0; i<10; i++)
	{
		str2 = 'a';
	}
	strcpy(str1,str2);
}

【說明】:

此處的問題所在是給str2賦值後,末尾並沒有'\0',因此使用strcpy會一直賦值,導致系統崩潰

試題3:

void test3(char* str1)
{
	char string[10];
	if(strlen(str1) <= 10)
	{
		strcpy(string,str1);
	}
}

【說明】:

1)此處的問題在於strlen計算字元的個數是不帶'\0'的,

2)應該改為if(strlen(str1)<10)

試題4:

void GetMemory(char* p)
  {
	  p = (char*)malloc(100);
  }
  void test4()
  {
	  char* str = NULL;
	  GetMemory(str);
	  strcpy(str,"hello");
	  printf("%s ",str);
  }

【說明】:
1)問題說明:GetMemory(str)這句裡傳的是str,當呼叫此函式的時候,相當於傳入的是一份形參臨時的拷貝,在函式的內部進行形參的修改並不能改變實參的值,所以呼叫此函式後,str還是NULL,再執行下面的strcpy,程式就崩潰了

2)解決的辦法可以看試題6的講解

試題5:

char *Getmemory()
  {
	  char p[] = "hello";
	  return p;
  }
  void test5()
  {
	  char* str = NULL;
	  str = Getmemory();
	  printf("%s ",str);
  }

【說明】:

1)函式裡的變數屬於區域性變數,當函式執行完後,變數就被銷燬了,所以此時,str是隨機值。

試題6:

void GetMemory(char** p)
  {
	  *p =(char*)malloc(100);
  }
  void test6()
  {
	  char* str = NULL;
	  GetMemory(str,"hello");
	  strcpy(str);
	  printf("%s",str);
  }

【說明】:

1)此處就是對試題4的問題改進,

2)但是還有一個問題,就是在使用malloc申請記憶體後,我們要進行判斷記憶體是否申請成功即if(*p == NULL){//進行記憶體失敗的處理}

試題7:

 void test7()
  {
	  char* str = (char*)malloc(100);
	  strcpy(str,"hello");
	  free(str);
	  //...
  }

【說明】:

問題有兩個:

1)申請記憶體後,要進行判斷是否申請成功,同6

2)free後,要記得將str =NULL,不然str就會變成野指標

試題8:

void swap(int* p1,int* p2)
  {
	  int *p;
	  *p = *p1;
	  *p1 = *p2;
	  *p2 = *p;
  }

【說明】:

此處的問題:使用*p作為中間變數進行交換,但是p是一個野指標,有可能指向系統區,導致系統崩潰,因此我們採用下面的寫法

void swap(int *p1,int* p2)
{
	int p = *p1;
	*p1 = *p2;
	*p2 = p;
}

再次總結:(關於常出現問題的地方)

1、1)字串是以'\0'結尾的

      2)strlen計算的時候是不算'\0'的

      3)對陣列越界的有敏感度

      4)對常出現的庫函式模擬實現

2、1)對指標的理解:包括一級指標二級指標各自的定義

      2)變數的生存週期和作用域

      3)良好的動態記憶體申請和釋放習慣


相關推薦

Linux下C語言的經典試題

ref 使用 linu 學習資源 chan ima 什麽 img c語言 本篇文章整理了幾道Linux下C語言的經典面試題,相信對大家更好的理解Linux下的C語言會有很大的幫助,歡迎大家探討指正。 1、如果在Linux下使用GCC編譯器執行下列程序,輸出結果是什麽? 答

Linux大牛分享的7經典試題和秒收 offer 的技巧

開發技能 多個 ins 主從架構 統計 mongo 交換 到你 移動客戶端 筆者其實沒有想到去面試,只是在智聯上更新了一下簡歷,就陸陸續續接到很多獵頭的郵件和電話,閑話少說,下面就分享給大家Linuxer的面試經歷: 首先,獵頭或者公司人資會把公司的介紹及崗位要求發到你郵箱

Bat大廠出場率最高的50經典試題!iOS開發者們不要錯過咯!

小編整理了一個PDF文件的面試題,由於平臺不能上傳檔案,需要答案可以加小編的QQ交流群656315826,在裡面獲取文件,也歡迎招聘者,找工作的來,提供一個更大的平臺(需要的朋友可以獲取,希望可以幫助到大家) ⽬錄: 基礎 1、如何令⾃⼰所寫的物件具有拷⻉功能? 2、說說你理解

運維工程師分享7經典試題,看完輕鬆拿Offer

首先,獵頭或者公司人資會把公司的介紹及崗位要求發到你郵箱(或者QQ、微信),下面這份是獵頭髮給我的崗位說明,為了職業道德操守,公司的介紹和麵試通知資訊我就不貼出來了,我就把崗位要求貼出來:職位描述:1、 負責應用伺服器的安裝、配置、優化與維護;2、 負責應用系統的日誌資訊備份

30經典試題

1.HashMap是如何擴容的? 當hashmap中的元素個數超過陣列大小*loadFactor時,就會進行陣列擴容,loadFactor的預設值為0.75,也就是說,預設情況下,陣列大小為16,那麼當hashmap中元素個數超過16*0.75=12的時候,

Java試題

1.super與this的區別? this當前類的物件,super父類物件。 在子類訪問父類的成員和行為,必須受類繼承規則的約束。 而this代表當前物件,所有資源的可以訪問。 在建構函式中,如果第一行沒有寫super(),編譯器會自動插入,但是如果父類

16經典試題(嵌入式軟體)

#define MIN(A,B) ((A) <= (B)? (A) : (B)) 這個測試是為下面的目的而設的: 1). 標識#define在巨集中應用的基本知識。這是很重要的,因為直到嵌入(inline)操作符變為標準C的一部分,巨集是方便產生嵌入程式碼的唯一方法,對於嵌入式系統來說,為了能達到要求的

Redis試題都不懂,怎麽拿offer?

sid data 自己 隊列 開始 更新 分布式 參數 惰性 一、緩存雪崩1.1什麽是緩存雪崩?回顧一下我們為什麽要用緩存(Redis):為什麽要緩存 現在有個問題,如果我們的緩存掛掉了,這意味著我們的全部請求都跑去數據庫了。如果緩存掛掉了,全部請求跑去數據庫了 在前面學習

python 試題

pen txt enc num nes int 文本 行數 一個 name = "lzl" def f1(): print(name) def f2(): name = ‘eric‘ f1() f2() (‘hello‘)

Redis試題都不懂,offer肯定與你擦肩而過

  今天來分享一下Redis幾道常見的面試題: 如何解決快取雪崩? 如何解決快取穿透? 如何保證快取與資料

c::關於strcpy經典試題~

試題1: void test1() { char str1[10]; char* str2 = "0123456789"; strcpy(str1,str2); } 【說明】: 1)str2

C++ STL和經典試題

https://blog.csdn.net/dingyahui123/article/details/78644235   C++ STL 的實現: 1.vector:  底層資料結構為陣列 ,支援快速隨機訪問。 2.list:   

分享經典的javascript試題

cti function 一點 經典的 bsp log 分享 輸出 for 這幾道題目還是有一點意思的,大家可以研究一番,對自己的技能提升絕對有幫助。 1、調用過程中輸出的內容是什麽 function fun(n, o) { console.log(o);

第一章:10C/C++經典試題

面試題 1:變數的宣告和定義有什麼區別 為變數分配地址和儲存空間的稱為定義,不分配地址的稱為宣告。 一個變數可以在多個地方宣告,但是隻在一個地方定義。 加入 extern 修飾的是變數的宣告,說明此變數將在檔案以外或在檔案後面部分定義。 說明:很多時候一個變數,只是宣告不分配記憶體空間,直到具體使用時

第三章:10C/C++經典試題

面試題 21:談談你對程式設計規範的理解或認識 程式設計規範可總結為:程式的可行性,可讀性、可移植性以及可測試性。 說明:這是程式設計規範的總綱目,面試者不一定要去背誦上面給出的那幾個例子,應該去理解這幾個例子說明的問題,想一想,自己如何解決可行性、可讀性、可移植性以及

C#經典試題100

1. .NET和C#有什麼區別 答:.NET一般指 .NET FrameWork框架,它是一種平臺,一種技術。 C#是一種程式

C++ 經典試題

sel 備份 函數地址 開發 對象 const對象 代碼 結構 函數類型 1,關於動態申請內存 答:內存分配方式三種: (1)從靜態存儲區域分配:內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。 全局變量,static變量。 (2)在棧上創建:在執行

C#經典試題及答案

list add 字段 有一個 副本 udp 隔離性 垃圾回收 readonly 字節 1.請你說說.net 中類和結構的區別? 答:結構和類具有大體的語法,但是結構受到的限制比類多。結構不能聲明默認的的構造函數,為結構的副本是編譯器創建和銷毀的,所以不需要默認的構造函數和

C++經典試題匯總

代碼 get child pre delet 函數調用 列表 code pub 1. 下面代碼輸出什麽?為什麽?(初始化列表) #include<iostream> using namespace std; class Test { int m_i

110python試題,你會個?

最近公眾號新來了不少朋友,這幾天不少讀者朋友後臺留言問我有沒有python面試題,今天統一給大家分享一遍,希望能幫助準備找工作和仍在找工作的同學,儘快找到工作,該文110道面試題大部分題目屬於鞏固基本python知識點的題目,希望對基本知識不熟悉的同學,能認真做一遍,肯定會有不少收穫。 內