什么时候应该在字符数组(char[])上使用字符指针(char*)?
是否存在一种类型优先于另一种类型的情况 我唯一能想到的是 指针使用4个字节,字符数组的大小取决于字符串的长度,因此,如果您有一个非常大的字符串,最好使用字符指针,以节省内存例如:如果您通过参数传递字符串 但是在字符串操作方面,哪一个是首选的 例如:什么时候应该在字符数组(char[])上使用字符指针(char*)?,c,arrays,pointers,malloc,C,Arrays,Pointers,Malloc,是否存在一种类型优先于另一种类型的情况 我唯一能想到的是 指针使用4个字节,字符数组的大小取决于字符串的长度,因此,如果您有一个非常大的字符串,最好使用字符指针,以节省内存例如:如果您通过参数传递字符串 但是在字符串操作方面,哪一个是首选的 例如: char *hello_pointer = malloc(sizeof(char) * 20); char hello_array[20]; strcat(hello_pointer, "hello pointer"); strcat(hello_
char *hello_pointer = malloc(sizeof(char) * 20);
char hello_array[20];
strcat(hello_pointer, "hello pointer");
strcat(hello_array, "hello array");
在这种情况下,一个缓冲区是否优于另一个缓冲区?这不是关于“节省内存”,而是关于动态分配,而不是固定长度的缓冲区
在您的示例中,假设您的数据不超过19个字符。这可能是一个巨大的错误。char*x
和char x[20]
之间的差异实际上并不相关,除非您希望在声明数据的范围之外使用该数据
使用malloc
分配的char*x
将在函数范围外保持。char[20]
不会,您需要在回收之前复制它
因此,相比之下,类似于char x[20]
的缓冲区:
- 有效地零成本创建
- 必须保守地调整大小,以避免占用过多的堆栈空间
- 声明时需要NUL终止,如
char x[20]={0}
- 一旦超出功能范围,就不能使用
char*x
:
- 具有较小的初始化成本
- 当不再使用时,必须使用
释放,否则程序将泄漏内存free
- 可在功能范围外使用
- 必须在使用前初始化,可能包含垃圾数据
- 正确初始化字符缓冲区
- 确保缓冲区对于要存储在其中的数据大小正确
- 通知任何操作此缓冲区的函数缓冲区的大小,或者在某些情况下,剩余的大小
- NUL终止您在其中可能覆盖终止符的任何缓冲区
- 释放任何动态分配的内存
get()
。这些都会造成巨大的缓冲区溢出漏洞
<>在C++中,很容易避免这种混乱,只使用<代码> STD::String 自动处理所有这些。 < P>这不是关于“保存内存”,而是关于动态分配与固定长度缓冲区的关系。
在您的示例中,假设您的数据不超过19个字符。这可能是一个巨大的错误。char*x
和char x[20]
之间的差异实际上并不相关,除非您希望在声明数据的范围之外使用该数据
使用malloc
分配的char*x
将在函数范围外保持。char[20]
不会,您需要在回收之前复制它
因此,相比之下,类似于char x[20]
的缓冲区:
- 有效地零成本创建
- 必须保守地调整大小,以避免占用过多的堆栈空间
- 声明时需要NUL终止,如
char x[20]={0}
- 一旦超出功能范围,就不能使用
char*x
:
- 具有较小的初始化成本
- 当不再使用时,必须使用
释放,否则程序将泄漏内存free
- 可在功能范围外使用
- 必须在使用前初始化,可能包含垃圾数据
- 正确初始化字符缓冲区
- 确保缓冲区对于要存储在其中的数据大小正确
- 通知任何操作此缓冲区的函数缓冲区的大小,或者在某些情况下,剩余的大小
- NUL终止您在其中可能覆盖终止符的任何缓冲区
- 释放任何动态分配的内存
get()
。这些都会造成巨大的缓冲区溢出漏洞
在C++中,很容易避免这种混乱,只使用<代码> STD::String 自动处理所有这些。 < P>差异在于,用<代码> MalCube()> <代码> > < <代码> >,您将获得堆上分配的内存,这将慢,并且不会随着范围的结束而被破坏。
char hello\u数组[20]
将在堆栈上分配,并将与堆栈帧一起删除
另外,使用malloc(sizeof(char)*20)不仅可以分配一个指针,还可以分配内存块来处理20个字符。大小将是相同的。不同的是,使用
malloc()
或new
可以在堆上分配内存,这会更慢,并且不会随着作用域的结束而销毁。
char hello\u数组[20]
将在堆栈上分配,并将与堆栈帧一起删除
另外,使用malloc(sizeof(char)*20)不仅可以分配一个指针,还可以分配内存块来处理20个字符。大小将相同。更喜欢使用
std::string
。这是否回答了您的问题?我