'Cannot use strcpy with 2 string (segmentation fault) [duplicate]

What's wrong with this code?:

int main(int argc, char ** argv) {
    char strs[] = "What will be printed?";
    char *str1;
    char *str2;

    strs[5] = '\0';
    str1 = strs;
    strcpy(str2, str1);

    printf("%s\n", str2);

    return 1;
}

I want it to print "What", instead i get segmentation fault.

I believe it has something to do with the strcpy(str2, str1);, but what is the explanation for that? The signature of strcpy is char* strcpy(char* destination, const char* source); and that's exactly what i did.

Could you explain that to me?

c


Solution 1:[1]

Your destination string is not initialized - it has no memory reserved for itself. An attempt to write to it causes invalid memory access (you're trying to overwrite something completely random and unplanned) and is followed by a segmentation fault.

One clean way to initialize a string is to define a global macro variable that just sets the largest size of strings you plan on using in your code,

#define MAXBUF 100

Then in your main you can simply write:

char str2[MAXBUF];

And your program will work. Alternative is to use dynamic memory allocation which you will likely learn about soon.

Solution 2:[2]

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

int main() {
    char *src = "What will be printed?";
    char dest[100];

    int START = 0;  // start of copy
    int LENGTH = 5; // length of copy

    // copies up to LENGTH characters from the string pointed to, by src to dest. In a case where the length of src is less than that of LENGTH, the remainder of dest will be padded with null bytes.
    strncpy(dest, &src[START], LENGTH); 

    printf("%s\n", dest);

    return 0;
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 atru
Solution 2