使用malloc, char数组和指针

Working with malloc, char array and pointer

本文关键字:指针 数组 char malloc 使用      更新时间:2023-10-16

我想了解malloc和字符数组(c风格)是如何工作的。考虑下面的代码

// 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. 为什么我能够添加15个字符的charBuffer,虽然我已经分配内存只有10个字符使用malloc?(见规则第4节)
  3. 为什么在第5节的输出中打印参考索引后面的字符而不是相应字符的地址?
  4. 如何找到单个字符的地址?
  5. 有可能知道数组的大小作为字符数组的元素被填充?例如,在第3节中显示循环中的sizeof(charbuffer),我们应该得到1,2,3…,10?

为什么charBuffer的大小是8(见第一行输出),虽然我已经分配了10的大小?

它不是。你输出了指向该缓冲区的指针的大小。

为什么我能够添加15个字符的charBuffer,虽然我已经分配的内存只有10个字符使用malloc?

你不是。然而,相反地,计算机不被允许特意通知你的错误。你违反了内存规则。

为什么在第5节的输出中打印参考索引后面的字符而不是相应字符的地址?

因为在流中插入char*会触发格式化的插入,因此流假定您正在流式传输c字符串。你就是

如何找到单个字符的地址?

你可以写static_cast<void*>(&charBuffer[i])来避免这种特殊情况的处理,而把地址打印出来。

有可能知道数组的大小作为字符数组的元素被填充?例如,在第3节中显示循环中的sizeof(charbuffer),我们应该得到1,2,3…,10?

数组的大小不会改变,只会改变为其写入新值的元素的数量。您可以使用计数器变量自己跟踪。