从 C++ 中的函数操作字符数组缓冲区

Manipulating a char array buffer from a function in C++

本文关键字:字符 数组 缓冲区 操作 函数 C++      更新时间:2023-10-16

我想创建一个char数组,我们称之为缓冲区。然后我想将指向缓冲区的指针传递给各种函数并操作缓冲区。

以下是描述目标的代码片段:

void manipCharBuffer(char* buffer) {
   buffer = "DERP";
   cout << buffer;
}
int main() {
   char buffer[256] = "JUNK STRING";
   std::cout << buffer;
   manipCharBuffer(buffer);
   ctd::cout << buffer;
}

为什么manipCharBuffer不更改缓冲区?就像它在函数内部仍然只有本地范围一样。

这是正在发生的事情的真实世界的类比。我在一张纸上写下我的电话号码。我给你一份那张纸。在副本上,你删除我的号码并写下你自己的号码。然后你拨打你刚刚写的号码。

在这个函数中:

void manipCharBuffer(char* buffer) {
   buffer = "DERP";

名称bufferbuffermain中不同。为避免混淆,您可以使用不同的变量名称,例如:

void manipCharBuffer(char* p_buffer) {
   p_buffer = "DERP";

希望这能清楚地说明为什么在这里main没有区别。您正在将本地指针p_buffer设置为指向不同的 char 数组。("DERP"是位于内存中某处的字符数组)。

如果要将字符从一个字符数组复制到另一个字符数组,则必须编写复制字符的代码;一种方法是:

std::strcpy( p_buffer, "DERP" );

在 main 函数中,变量缓冲区指向堆栈上分配的 256 个字符的数组。当它发送到函数manipCharBuffer时,地址是按值传输的。这意味着每次调用函数manipCharBuffer都会创建一个也命名为buffer的局部变量,该变量存储在内存中与主函数中的变量缓冲区不同的位置,但两者都指向内存中的同一位置。所以这条线的结果:

buffer = "DERP";

是函数中的局部变量现在指向内存中存储字符串常量"DERP"的不同位置(在编译时确定),而无需更改您在堆栈上分配的缓冲区,并且 main 中的缓冲区变量仍然指向它。

您尝试执行的操作可以按如下方式实现:

memcpy(buffer,"DERP",sizeof(char)*5); //5 and not 4 to include the null terminator
不可能按值传递 C 数组,但是可以C++数组 (std::

array) 和动态数组 (std::vector)。

#include <iostream>
#include <string.h>
using namespace std ;
void manipCharBuffer(char* buffer) {
  strcpy(buffer,"DERP");
  cout << "n string in called  function  "<<buffer;
}
int main() {
   char buffer[256] = "JUNK STRING";
   cout << " string before call is : " <<buffer;
   char*p = buffer ;
   manipCharBuffer(p);
   cout << "n string after call is  : " <<buffer;
   return 0;
}