使用 malloc、char 数组和指针
Working with malloc, char array and pointer
我正在尝试了解 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
我想了解以下内容,
- 为什么 charBuffer 的大小是 8(见输出的第一行),尽管我已经分配了 10 的大小?
- 为什么我使用 malloc 只为 10 个字符分配了内存,却可以向 charBuffer 添加 15 个字符? (见代码第 4 节)
- 为什么第 5 节的输出中打印的是参考索引之后的字符,而不是相应字符的地址?
- 如何找到单个字符的地址?
- 当字符数组的元素被填满时,是否可以知道数组的大小?例如在第 3 节的循环中显示 sizeof(charbuffer),我们应该得到 1,2,3..,10?
Why is the size of the charBuffer 8(see first line of output) although I have allocated a size of 10?
不是。您打印出指向该缓冲区的指针的大小。
Why I am able to add 15 characters to charBuffer although I have allocated memory for only 10 character using malloc?
你不是。但是,相反地,允许计算机不特意通知您您的错误。你违反了记忆规则。
Why are the characters after the reference index being printed instead of the address of the corresponding characters in the output for section 5?
因为向流中插入 char*
会触发 格式化插入,因此流假定您正在流式传输 C 字符串。那么,你 是 。
How do I find the address of individual characters?
您可以编写 static_cast<void*>(&charBuffer[i])
来避免这种特殊情况处理,而是打印地址。
It is possible to know the size of the array as the elements of the character array are getting filled? For example display the the sizeof(charbuffer) in the loop in section 3, we should get 1,2,3..,10?
数组的大小永远不会改变,只会改变您写入新值的元素的数量。您可以使用计数器变量自行跟踪。
我正在尝试了解 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
我想了解以下内容,
- 为什么 charBuffer 的大小是 8(见输出的第一行),尽管我已经分配了 10 的大小?
- 为什么我使用 malloc 只为 10 个字符分配了内存,却可以向 charBuffer 添加 15 个字符? (见代码第 4 节)
- 为什么第 5 节的输出中打印的是参考索引之后的字符,而不是相应字符的地址?
- 如何找到单个字符的地址?
- 当字符数组的元素被填满时,是否可以知道数组的大小?例如在第 3 节的循环中显示 sizeof(charbuffer),我们应该得到 1,2,3..,10?
Why is the size of the charBuffer 8(see first line of output) although I have allocated a size of 10?
不是。您打印出指向该缓冲区的指针的大小。
Why I am able to add 15 characters to charBuffer although I have allocated memory for only 10 character using malloc?
你不是。但是,相反地,允许计算机不特意通知您您的错误。你违反了记忆规则。
Why are the characters after the reference index being printed instead of the address of the corresponding characters in the output for section 5?
因为向流中插入 char*
会触发 格式化插入,因此流假定您正在流式传输 C 字符串。那么,你 是 。
How do I find the address of individual characters?
您可以编写 static_cast<void*>(&charBuffer[i])
来避免这种特殊情况处理,而是打印地址。
It is possible to know the size of the array as the elements of the character array are getting filled? For example display the the sizeof(charbuffer) in the loop in section 3, we should get 1,2,3..,10?
数组的大小永远不会改变,只会改变您写入新值的元素的数量。您可以使用计数器变量自行跟踪。