Search code examples
cmemcpy

Memcpy with a void pointer


I am having trouble with the memcpy function. I need a function that stores data into a void pointer. Here is a simple example of it:

void saveData(void* data)
{
  char inputData[] = "some data";
  memcpy((char*)data, inputData, sizeof(inputData));
}

However I get segmentation errors when I do this, even though it compiles just fine. My function argument has to be a void pointer because I may have different data formats to input and I may not know the size of the data ahead of time. Could somebody tell me what I am doing wrong?

Please and thank you.

***UPDATE: Thanks all for the helpful responses. As most of you pointed out, I did not initialize void* data. That fixed it. Now my question is: when I do dynamic allocation for the void* data (or even char* data), I give it a size, but when I do memcpy, it allows me to write an ever bigger string than I first assigned space for. I also tried just doing char* data, and the same thing happens. This is my sample code:

char inputData[] = "123456789";
void* data1 = malloc(5*sizeof(char));
char* data2 = (char*)malloc(5*sizeof(char));

memcpy(data1,inputData,sizeof(inputData));
memcpy(data2,inputData,sizeof(inputData));

When I print out the results, the entire string of inputData get copied even though I only allocated enough space for 5 chars. Shouldn't that give me an error?


Solution

  • Your function parameter data needs to point to somewhere that there is memory available. You could do something like this:

    int main()
    {
      char myString[256];
      saveData((void*)myString);
    }
    

    If you prefer to use malloc and free, then your code would be more like this:

    int main()
    {
      char* myString = (char*)malloc(256);
      saveData((void*)myString);
      free(myString);
    }
    

    ..the trouble with both of these is that you don't know how long the string needs to be. It would be far safer/easier to use std::string.

    std::string myString;  // an empty string
    myString += "some data"; // append a string