Question

I encountered "segmentation fault" error when running the following code, but I am wondering why:

int main()
{
char *str = "abcdefghijklmn";
void *str_v;

memcpy(str_v, str, 14);

printf("str_v is %s \n", (char *) str_v);
return 0;
}

Thanks for help.

Was it helpful?

Solution

void *str_v;

defines str_v to be of type void *, i.e., it can store a pointer a variable of any type. However, you need memory space for the characters to be copied by memcpy from the source to the destination. Therefore, you need to allocate enough memory using malloc -

char *str_v = malloc(strlen(str) + 1);

strlen does not count the terminating null byte in the string pointed to by str. Therefore, you have to allocate one extra byte for the terminating null byte.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
    // a string literal is read-only so make str
    // const so attempting to change will cause
    // compiler error
    const char *str = "abcdefghijklmn";

    // allocate memory dynamically to the 
    // string pointed to by str. +1 is for the
    // terminating null byte since strlen does 
    // not count the null byte
    char *str_v = malloc(strlen(str) + 1);

    // malloc can fail if there is not enough
    // memory to allocate. handle it
    if(str_v == NULL) {
        printf("error in memory allocation\n");
        return 1;
    }

    // copy all bytes in the string pointed to
    // by str to the buffer pointed to str_v.
    // number of bytes to be copied is strlen(str) + 1
    // +1 for copying the terminating byte as well
    memcpy(str_v, str, strlen(str) + 1);

    // print the copied string. It need not be
    // cast to (char *) since str_v is already
    // of type (char *) 
    printf("str_v is %s \n", str_v);

    // free the dynamically allocated space 
    free(str_v);
    return 0;
}

OTHER TIPS

You need to first allocate memory for str_v:

void *str_v = malloc(14);

You are using uninitialized pointer in memcpy(str_v, str, 14);, to fix it, you could add the following statements before it:

str_v = malloc(14);
if (str_v == NULL) { /* malloc failed */ }

Because you have not allocated any memory for str_v

You can just do

char * str_v = strdup( str );

From http://linux.die.net/man/3/strdup:

#include <string.h>

char *strdup(const char *s);

The strdup() function returns a pointer to a new string
which is a duplicate of the string s. 
Memory for the new string is obtained with malloc(3),
and can be freed with free(3).
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top