Can I call functions that take an array/pointer ar

2020-02-14 04:54发布

问题:

I want to rewrite some code that uses a lot of unsigned char arrays, to instead make use of std::vector<unsigned char> objects. The problem I have is that these are currently used to store the data that will be written to either a serial port or socket write buffer and the library functions to do this take either void* or unsigned char* . An example of such a function is

  WriteToSocketBuffer(unsigned char* pBuffer, int iSize);

so currently I have code of the form

 unsigned char* pArray = new unsigned char[iSize];
 //   populate array with data
 WriteToSocketBuffer(pArray,iSize);
 delete [] pArray;

My question is the following: If I change my class to have a std::vector<unsigned char> instead of a raw array can I simply call my library function using

  std::vector<unsigned char> myVector;
  WriteToSocketBuffer(&myVector[0],myVector.size());

Does passing the address of the first element in the vector act in the same was as passing in the address of the first element in a raw array. Is it this simple?

回答1:

Yes, The elements of a vector are assured to be contiguous similar to an array.

Reference:

C++03 Standard: [lib.vector] 23.2.4 Class template vector

......
The elements of a vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size()



回答2:

C++98 didn't mandate contiguous allocation for the data in an std::vector, but that's what all known implementations did anyway.

As of C++03, that was standardized as a requirement, so it's now required, not just how things happen to be.



回答3:

Yes, you can do that, as long as the buffer is never empty.

If the vector is ever empty, then &buffer[0] is an error, and it will likely crash even though the called function wouldn't normally dereference the pointer because the size is 0.