欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

[C語言]經(jīng)典筆試題-創(chuàng)新互聯(lián)

這些c語言經(jīng)典筆試題,你做過了嗎?讓我們一起來看看吧!

創(chuàng)新互聯(lián)2013年至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站建設(shè)、做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元雨山做網(wǎng)站,已為上家服務(wù),為雨山各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108題目1 代碼
#define _CRT_SECURE_NO_WARNINGS 1
#include#include#includevoid GetMemory(char* p)
{
    p = (char*)malloc(100);
}
void Test(void)
{
    char* str = NULL;
    GetMemory(str);
    strcpy(str, "hello world");
    printf(str);
}
int main() {
    Test();
    return 0;
}
分析

拿到代碼的第一步,讓我們先來看main函數(shù)。main函數(shù)調(diào)用了無參的Test函數(shù),因此,我們轉(zhuǎn)而去看Test()函數(shù)中的內(nèi)容。(注意:不要一上來就去看功能函數(shù),這樣也許會(huì)遺漏main函數(shù)中的一些操作,導(dǎo)致分析出現(xiàn)偏差?。?/p>

粗看Test函數(shù),我們可以很容易分析出其功能為字符數(shù)組str在內(nèi)存中開辟一塊空間,將hello world字符串拷貝到str中并打印出來。乍一看,Test函數(shù)中并沒有問題,但是,你有沒有隱隱約約覺得有些奇怪呢?再看看在Test函數(shù)中被調(diào)用的GetMemory函數(shù),或許你會(huì)發(fā)現(xiàn)錯(cuò)誤之處。

GetMemory函數(shù)的參數(shù)是char* p,看到這里,你是否找到了錯(cuò)誤?

如下圖所示,這道題的錯(cuò)誤在于,這里的傳參過程是值拷貝,也即,形參p是實(shí)參str的一份臨時(shí)拷貝,所以,p使用malloc函數(shù)開辟的內(nèi)存空間str是拿不到的,函數(shù)執(zhí)行完成返回Test函數(shù)后,str依然是空指針,而對空指針調(diào)用strcpy函數(shù)會(huì)報(bào)錯(cuò)導(dǎo)致程序崩潰。

你以為到這里就結(jié)束了嗎?細(xì)心的小伙伴也許還發(fā)現(xiàn)了另外一個(gè)錯(cuò)誤,那就是內(nèi)存泄漏。這段程序中調(diào)用了malloc函數(shù),卻沒有調(diào)用free函數(shù)。而且,更為嚴(yán)重的問題是,即使調(diào)用了free(str);這個(gè)問題依然沒有得到解決。

當(dāng)GetMemory函數(shù)執(zhí)行結(jié)束后,p作為形參被釋放,而p指向的那塊malloc出的一塊內(nèi)存空間將再也找不到了,既然無法得知地址,自然也就無法釋放了,由此造成內(nèi)存泄漏。

修改代碼

之前,我們分析出這段代碼存在兩處錯(cuò)誤,值傳遞和內(nèi)存泄漏,因此,修改時(shí)也應(yīng)該針對這兩個(gè)問題進(jìn)行改動(dòng)。

但注意:

修改時(shí)不應(yīng)該改變原程序的思路。因此,不使用GetMemory函數(shù),直接在Test函數(shù)中開辟空間的做法是不合適的。

在修改時(shí),首先將值傳遞改為地址傳遞,傳參時(shí)使用&str,而&str的類型為char**,因此GetMemory函數(shù)的形參也要做相應(yīng)處理。

同時(shí),在開辟空間之后,我們可以進(jìn)一步優(yōu)化代碼,即加上對malloc函數(shù)的判斷,當(dāng)malloc失敗時(shí)對用戶進(jìn)行提示。

在Test函數(shù)中,同樣應(yīng)該做出判斷,當(dāng)str不為空時(shí)才執(zhí)行strcpy函數(shù),打印字符串并釋放malloc開辟的空間。

使用后也不要忘記使用free函數(shù)釋放空間,并將指針置空

#define _CRT_SECURE_NO_WARNINGS 1
#include#include#includevoid GetMemory(char** p)
{
    *p = (char*)malloc(100);
    if (*p == NULL) {
        printf("開辟失敗\n");
    }
}
void Test(void)
{
    char* str = NULL;
    GetMemory(&str);
    if (!str) {
        strcpy(str, "hello world");
        printf(str);
        free(str);
? ? ? ? str=NULL;
    }
   
}
int main() {
    Test();
    return 0;
}
運(yùn)行結(jié)果

修改前:程序直接崩潰

修改后:正常輸出hello world

題目2 代碼
char* GetMemory(void)
{
    char p[] = "hello world";
    return p;
}
void Test(void)
{
    char* str = NULL;
    str = GetMemory();
    printf(str);
}
int main() {
    Test();
    return 0;
}
分析

這道題的錯(cuò)誤是非法訪問內(nèi)存。

在GetMemory函數(shù)中,p是一個(gè)char數(shù)組形參,當(dāng)這個(gè)函數(shù)執(zhí)行結(jié)束后,p就被銷毀了。但是,函數(shù)最后一句是 return p,而返回值為char*,所以此時(shí)的p為指向數(shù)組首元素的指針。將這個(gè)指針指向的地址賦給str后再打印,就構(gòu)成了非法訪問內(nèi)存。

修改

將char p[] 改成char* p,p存放的就是常量字符串的地址,即使出了GetMemory函數(shù),這個(gè)常量字符串依然存在。

char* GetMemory(void)
{
    char* p = "hello world";
    return p;
}
void Test(void)
{
    char* str = NULL;
    str = GetMemory();
    printf(str);
}
int main() {
    Test();
    return 0;
}
運(yùn)行結(jié)果

修改前:

修改后:

題目3 代碼
void GetMemory(char** p, int num)
{
    *p = (char*)malloc(num);
}
void Test(void)
{
    char* str = NULL;
    GetMemory(&str, 100);
    strcpy(str, "hello");
    printf(str);
}
int main() {
    Test();
    return 0;
}
分析

拿到這道題之后,你是不是大致看完卻發(fā)現(xiàn)好像沒有什么問題,運(yùn)行后的結(jié)果也是正確的。那這道題的問題究竟在哪呢?

這道題的問題并不大,但卻很重要。答案是,內(nèi)存泄漏。

這段程序中調(diào)用了malloc函數(shù),卻沒有調(diào)用free函數(shù),導(dǎo)致在GetMemory中開辟的空間無法釋放。

修改

只需要在代碼最后加上free函數(shù)即可。

void GetMemory(char** p, int num)
{
    *p = (char*)malloc(num);
}
void Test(void)
{
    char* str = NULL;
    GetMemory(&str, 100);
    strcpy(str, "hello");
    printf(str);
? ? free(str);
? ? str=NULL;
}
int main() {
    Test();
    return 0;
}
運(yùn)行結(jié)果

修改前:

修改后:

題目4 代碼
void Test(void)
{
    char* str = (char*)malloc(100);
    strcpy(str, "hello");
    free(str);
    if (str != NULL)
    {
        strcpy(str, "world");
        printf(str);
    }
}
int main() {
    Test();
    return 0;
}
分析

這道題在分析時(shí)很容易看出錯(cuò)誤,但在修改時(shí)卻有一絲難度。

從代碼中可以分析出,這道題的問題在于在free(str)后還使用str,雖然最后的結(jié)果看似正常,但已經(jīng)構(gòu)成了非法訪問內(nèi)存的錯(cuò)誤

修改

在修改時(shí),我相信絕大多數(shù)小伙伴會(huì)選擇直接將free移到最后,如下:

void Test(void)
{
    char* str = (char*)malloc(100);
    strcpy(str, "hello");
    if (str != NULL)
    {
        strcpy(str, "world");
        printf(str);
    }
? ? free(str);
}
int main() {
    Test();
    return 0;
}

但是,這樣修改之后卻顯得有些奇怪,前一句strcpy(str, "hello");明確表示str里此時(shí)是有數(shù)據(jù)的,再判斷str != NULL不是多此一舉嗎?難道要將這些都刪去?

還記得我們之前提過的原則么,盡量不要改變代碼原來的思路,因此,這個(gè)方法是不合適的。

正確的修改方法是:在用free函數(shù)釋放開辟的空間之后就立即將str置空,這樣既保證了代碼的邏輯未被修改,又解決了非法訪問內(nèi)存的問題。

void Test(void)
{
    char* str = (char*)malloc(100);
    strcpy(str, "hello");
? ? free(str);
? ? str==NULL;
    if (str != NULL)
    {
        strcpy(str, "world");
        printf(str);
    }
    
}
int main() {
    Test();
    return 0;
}
運(yùn)行結(jié)果

修改前:

修改后:

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站標(biāo)題:[C語言]經(jīng)典筆試題-創(chuàng)新互聯(lián)
分享鏈接:http://aaarwkj.com/article30/hseso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、移動(dòng)網(wǎng)站建設(shè)、商城網(wǎng)站手機(jī)網(wǎng)站建設(shè)、企業(yè)建站網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
亚洲国内一区二区三区| av网址在线免费观看| 91亚洲自偷观看高清| 久久精品国产亚洲av高清观看| 精品国产综合一区二区三区| 日韩中字在线一区二区| 亚洲色图综合在线观看| 欧美成人精品三级在线网站| 国产精品国语对白av处女| 成人性生交免大片免费| 日本黄色大波少妇网站| 欧美亚洲av一区二区三区| 久久综合给合综合久久| 99热精品成人免费观看 | 日韩视频精品推荐一区二区| 国产精品又大又黑又长又粗| 精彩国产av一区二区三区| 日本少妇熟女一区二区| 国产精品一区二区毛卡片| 亚洲精品香蕉久久情趣| 中文字幕久久一区二区三区| 亚洲激情av在线观看| 国产成人精品高清国产三级| 未满十八禁止在线观看av| 中出亚洲精品日韩在线视频| 99热这里只有精品网址| 亚洲成人av日韩在线| 亚洲av污精品一区二区三区| 国产精品一区二区三区熟女| 亚洲国产区男人的天堂| 亚洲少妇熟女一区二区三区| 国内精品人妻久久毛片| 国产在线精品成人欧美| 91九色国产原创在线观看| 日韩少妇人妻一区二区| 亚洲黄色av乱码在线观看| 国产精品对白久久久久粗| 国产亚洲一区二区三区乱码| 免费国产黄片在线播放| 欧美日韩在线一区2区| 91在线视频欧美国产|