C++的一些小問題(一)

來源:互聯網
上載者:User

char a[]="liuj";定義的是一個字串,字串後面以'\0'結尾,所以 sizeof(a)=5

char b[]={'l','i','u','j'};定義的是一個字元數組,所以sizeof(b)=4

在c語言中,字串和字元數組都可以用a[0],a[1]……來調用其中的某個元素。而在perl中,字串標量$a="liuj",是無法用下標來訪問的。如果一定想訪問的話,可以用split("",$a)把字串一個一個的分開。

CString類的應用是因為開始c++還沒有確定標準,有標準後就開始使用string類。使用string類要記得加上標頭檔<string>和using namespcae std; string類的賦值可以使用=直接賦值,也可以用建構函式的形式賦值str("liuj")。

Code
#include<iostream>
#include <string>
using namespace std;

char str[] = "liujian";
char *p = str ;
int n = 10;
int a=0,b=0,c=0,d=0,e=0;
int main(char st[100])
{
    a=sizeof ( str );
    b=sizeof ( p );
    c=sizeof ( n );
    d=sizeof( st );
    void *p = malloc( 100 );
    e=sizeof ( p );
    return 0;
}

得到a=8,b,c,d,e=4

const 有什麼用途?(請至少說明兩種)

答:(1)可以定義 const 常量

(2)const可以修飾函數的參數、傳回值,甚至函數的定義體。被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程式的健壯性。

在C++ 程式中調用被 C編譯器編譯後的函數,為什麼要加 extern “C”?
答:C++語言支援函數重載,C語言不支援函數重載。函數被C++編譯後在庫中的名字與C語言的不同。假設某個函數的原型為: void foo(int x, int y);該函數被C編譯器編譯後在庫中的名字為_foo,而C++編譯器則會產生像_foo_int_int之類的名字。由於編譯後的名字不同,C++程式不能直接調用C 函數。所以C++提供了C串連交換指定符號extern“C”來解決名字匹配問題。

最常見的一道c++筆試題

考察記憶體

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

請問運行Test函數會有什麼樣的結果?
答:程式崩潰。
函數參數都是局部變數,改變這些參數的值不會影響調用函數中的值。局部變數被儲存在棧中,函數返回時,棧被自動清空。malloc分配的記憶體不會被自動釋放,p指向自由儲存區中的記憶體塊,離開該指標的範圍時,該記憶體塊不會被自動歸還給自由儲存區。

因為GetMemory並不能傳遞動態記憶體,Test函數中的 str一直都是 NULL。strcpy(str, "hello world");將使程式崩潰。

char *GetMemory(void)
{
  char p[] = "hello world";
  return p;
}
void Test(void)
{
  char *str = NULL;
  str = GetMemory();
  printf(str);
}

請問運行Test函數會有什麼樣的結果?
答:可能是亂碼。因為GetMemory返回的是指向“棧記憶體”的指標,該指標的地址不是 NULL,但其原現的內容已經被清除,新內容不可知。
 p[]數組為函數內的局部自動變數,在函數返回後,記憶體已經被釋放。這是許多程式員常犯的錯誤,其根源在於不理解變數的生存期。

void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}

 請問運行Test函數會有什麼樣的結果?

答:(1)能夠輸出hello (2 )Test函數中也未對malloc的記憶體進行釋放。(3)GetMemory避免了試題1的問題,傳入GetMemory的參數為字串指標的指標,但是在GetMemory中執行申請記憶體及指派陳述式 p = (char *) malloc( num ); 後未判定記憶體是否申請成功,應加上: if ( *p == NULL ) {     ...//進行申請記憶體失敗處理  }  

void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);    
if(str != NULL)
{
  strcpy(str, “world”);
  printf(str);
}

 請問運行Test函數會有什麼樣的結果?
答:篡改動態記憶體區的內容,後果難以預料,非常危險。因為free(str);之後,str成為野指標,if(str != NULL)語句不起作用。

 指出以下代碼的問題

int main()
{
  char a;
  char *str=&a;
  strcpy(str,"hello");
  printf(str);
  return 0;
}

 答案:沒有為str分配記憶體空間,將會發生異常。問題出在將一個字串複製進一個字元變數指標所指地址。雖然可以正確輸出結果,但因為越界進行內在讀寫而導致程式崩潰。

請寫出一下代碼輸出

Code
#include<iostream>
using namespace std;

class A
{
public:
    virtual void Func1(void){cout<<"This is A::Func1\n";};
};

class B : public A
{
public:
    virtual void Func1(void){cout<<"This is B::Func1\n";};
};

class C : public A
{
public:
    virtual void Func1(void){cout<<"This is C::Func1\n";};
};

void Test(A *a)
{
    a->Func1();
}

int main()
{
A a;
B b;
C c;
Test(&a);
Test(&b);
Test(&c);
return 0;
}

This is A::Func1
This is B::Func1
This is C::Func1
因為使用了虛函數,每次調用都是在運行時判斷指向了哪種類型的執行個體。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.