从C ++中的函数处理char数组缓冲区

时间:2015-01-28 21:30:16

标签: c++

我想创建一个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没有改变缓冲区?就好像它在函数内部仍然只有局部范围。

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

在此功能内:

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

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

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

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

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

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

答案 2 :(得分:0)

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

buffer = "DERP";

是函数中的局部变量现在指向内存中的不同位置,其中存储字符串常量“DERP”(在编译时确定),而不更改在堆栈上分配的缓冲区,以及缓冲区变量in主要仍指向它。

您尝试做的事情可以通过以下方式实现:

memcpy(buffer,"DERP",sizeof(char)*5); //5 and not 4 to include the null terminator

答案 3 :(得分:0)

不可能按值传递C数组,但是C ++数组(std :: array)和动态数组(std :: vector)是可能的。如果你想使用c ++,最好使用标准库

#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;

}