2015-05-25 68 views
0

我想了解malloc和字符數組(c樣式)是如何工作的。考慮下面的代碼,使用malloc,字符數組和指針

// Example program 
#include <iostream> 
#include <cstdlib> 
#include <iomanip> 
using namespace std; 

int main() 
{ 
    //section1: Init 
    char line0[10] = {'a','b','c','d','e','f','g','h','i','j'}; 
    char line1[10] = {'z','y','x','w','v','u','t','s','r','q'}; 

    //section2: Allocate Character array 
    char* charBuffer = (char*) malloc(sizeof(char)*10); 
    cout<<sizeof(charBuffer)<<endl; 

    //Section3: add characters to the array 
    for (int i=0;i<10;i++) 
    { 
    *&charBuffer[i] = line0[i]; 
    } 
    //Section4:-add character to array using pointers 
    for (int i=0;i<15;i++) 
    { 
    charBuffer[i] = line1[i%10]; 
    } 
    //section5:-address of characters in the array 
    for (int i=0;i<15;i++) 
    { 
    cout<<"Address of Character "<<i<<" is: "<<&charBuffer[i]<<"\n"; 
    } 
    char *p1; 
    p1 = &charBuffer[1]; 
    cout<<*p1<<endl; 
    cout<<charBuffer<<endl; 
    free(charBuffer); 
    return 0; 
} 

輸出: -

8 
Address of Character 0 is: zyxwvutsrqzyxwv 
Address of Character 1 is: yxwvutsrqzyxwv 
Address of Character 2 is: xwvutsrqzyxwv 
Address of Character 3 is: wvutsrqzyxwv 
Address of Character 4 is: vutsrqzyxwv 
Address of Character 5 is: utsrqzyxwv 
Address of Character 6 is: tsrqzyxwv 
Address of Character 7 is: srqzyxwv 
Address of Character 8 is: rqzyxwv 
Address of Character 9 is: qzyxwv 
Address of Character 10 is: zyxwv 
Address of Character 11 is: yxwv 
Address of Character 12 is: xwv 
Address of Character 13 is: wv 
Address of Character 14 is: v 
y 
zyxwvutsrqzyxwv 

我想了解以下,

  1. 爲什麼CharBuffer的8的尺寸(見輸出的第一行)雖然我已經分配了10的大小?
  2. 爲什麼我能夠爲charBuffer添加15個字符,儘管我已經使用malloc爲10個字符分配了內存? (請參閱代碼的第4部分)
  3. 爲什麼打印參考索引之後的字符而不是第5部分輸出中相應字符的地址?
  4. 如何查找單個字符的地址?
  5. 當字符數組的元素被填滿時,可以知道數組的大小嗎?例如,在第3節的循環中顯示sizeof(charbuffer),我們應該得到1,2,3 ..,10?
+0

Gees ...每個問題一個問題,請! –

+0

@LightnessRacesinOrbit對不起。但是當背景相同時發佈5個背靠背問題是否可以? – Naveen

回答

4

爲什麼charBuffer 8的大小(請參閱輸出的第一行)儘管我已經分配了大小10?

不是。您打印出指向該緩衝區的指針的大小。

爲什麼我能夠向charBuffer添加15個字符,儘管我已經使用malloc爲10個字符分配了內存?

你不是。相反,儘管如此,計算機不允許告訴你你的錯誤。你違反了記憶規則。

爲什麼打印參考索引之後的字符而不是第5部分輸出中相應字符的地址?

由於插入char*到流觸發格式插入,從而使流假定你流的C字符串。其中,你好,

如何找到單個字符的地址?

您可以編寫static_cast<void*>(&charBuffer[i])以避免這種特殊情況的處理,並取而代之打印出地址。

當字符數組的元素被填滿時,可以知道數組的大小嗎?例如,在第3節的循環中顯示sizeof(charbuffer),我們應該得到1,2,3 ..,10?

陣列永遠不會改變的大小,只有要素的數量,你已經寫了一個新的價值。您可以使用計數器變量來跟蹤自己。

+0

非常感謝您的答案!再一次澄清。對於問題1,有沒有辦法找到malloc在堆中分配的內存塊的大小? – Naveen

+0

@Naveen:編號 –

+0

「哪一個,你是。」 - 他並不是因爲他的代碼中沒有C字符串,而只是一個非終止的字符數組 –