Char传递给其他功能最佳实践

时间:2014-09-24 09:18:32

标签: c++ visual-c++

我想将字符串传递给第二个函数,它填充字符数组并返回值。在第一个函数中,我希望在第二个函数填充后获取字符串长度。

第一步

 Planning to pass the character array 
 char data[10]="";
 GetData(data); // Here Iam doing memset value to data
 strlen(data);

第二步

 Planning to pass the character pointer 
 char *data;
 GetData(data); // what I should do 
 strlen(data);

有人可以建议哪种是最佳做法

3 个答案:

答案 0 :(得分:2)

您想使用std::string,例如:

std::string data;
void GetData(std::string& str);

通过非const引用允许GetData更改str

答案 1 :(得分:0)

理想情况下,字符指针应该由调用者拥有,并且应该注意分配(如果可能,或者被调用者必须代表调用者执行此操作)和释放

char *data = (char *) NULL; //  should initialize to know allocated or not

调用的原型,GetData应该是:

void GetData(char *& d); // pointer passed as reference

在GetData中,d应分配为:

d = new char[size]; //size should be appropriately decided including null terminating character
例如,如果你想存储一个"你好"比如,d应分配为:

d = new char[5+1]; // example

一旦完成,在调用者中,您必须解除分配为:

if (data) delete [] data;
data = (char *) NULL;

答案 2 :(得分:0)

Windows中的"经典",C兼容方法(其中最常用的是Visual C ++)是具有将缓冲区大小作为参数的函数,并返回复制的数据的大小或长度。例如:

//Inputs:
//  buffer: [out/opt] If not null, write data here.
//  size: [in] Buffer size including null terminator, ignored if buffer is null.
//Outputs:
//  buffer: The data.
//  Return Value: Length of data written to the buffer, without null terminator.
int GetData(char *buffer, size_t bufferSize);

这允许使用空缓冲区调用函数来获取分配的长度,分配数据并再次调用该函数。

但是,它不是很C ++,而且容易出错。从语言的角度来看,将指针/引用传递给指向分配的指针更好,但是在跨越DLL边界时有其缺点,在这种情况下,它建议由DLL分配的任何数据都由相同的DLL解除分配(防止使用普通的智能指针)。