我想将字符串传递给第二个函数,它填充字符数组并返回值。在第一个函数中,我希望在第二个函数填充后获取字符串长度。
第一步
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);
有人可以建议哪种是最佳做法
答案 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解除分配(防止使用普通的智能指针)。