Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么时候应该在字符数组(char[])上使用字符指针(char*)?_C_Arrays_Pointers_Malloc - Fatal编程技术网

什么时候应该在字符数组(char[])上使用字符指针(char*)?

什么时候应该在字符数组(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_

是否存在一种类型优先于另一种类型的情况

我唯一能想到的是

指针使用4个字节,字符数组的大小取决于字符串的长度,因此,如果您有一个非常大的字符串,最好使用字符指针,以节省内存例如:如果您通过参数传递字符串

但是在字符串操作方面,哪一个是首选的

例如:

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
    释放,否则程序将泄漏内存
  • 可在功能范围外使用
  • 必须在使用前初始化,可能包含垃圾数据
您100%负责:

  • 正确初始化字符缓冲区
  • 确保缓冲区对于要存储在其中的数据大小正确
  • 通知任何操作此缓冲区的函数缓冲区的大小,或者在某些情况下,剩余的大小
  • 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
    释放,否则程序将泄漏内存
  • 可在功能范围外使用
  • 必须在使用前初始化,可能包含垃圾数据
您100%负责:

  • 正确初始化字符缓冲区
  • 确保缓冲区对于要存储在其中的数据大小正确
  • 通知任何操作此缓冲区的函数缓冲区的大小,或者在某些情况下,剩余的大小
  • 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
。这是否回答了您的问题?我