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

int main() {
   const char* hello = "Hello, World!";
   char *str = malloc(14 * sizeof(char));

   for (int i = 0; i < 14; i++) {
      strcpy(str[i],hello[i]);
   }
   str[14]='\0';

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

   return 0;
}

Compilation warnings:

warning: passing argument 1 of 'strcpy' makes pointer from integer without a cast [-Wint-conversion]   
note: expected 'char *' but argument is of type 'char'   
warning: passing argument 2 of 'strcpy' makes pointer from integer without a cast [-Wint-conversion]

str is a pointer and hello too, what's going on?

3
Neither str[i] nor hello[i] is a pointer -- both are characters. And the next problem is that str[14] is off the end of the allocated memory -- you've allocated 14 bytes, with valid indexes from 0 to 13.Paul Hankin
str is a pointer, str[i] is not.tkausl
strcpy(str, hello) is the correct invocation.Paul Hankin
... without the loop.John Bollinger
@PaulHankin strdup is not standard.Jabberwocky

3 Answers

6
votes

You are doing it wrong:

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

int main() {
   const char* hello = "Hello, World!";
   char *str = malloc(strlen(hello)+1);

   strcpy(str,hello);
   printf("%s\n", str);
   free(str);
   return 0;
}

Explanation: strcpy operates on pointers, where both are start location to write to and read from, so you have to pass those, not characters. Your read location is hello, your write location is str. Then strcpy loops until it finds a 0 character (which is included) to stop copying, so your loop is unnecessary. Last thing is that you have to free allocated memory. Also sizeof(char) doesn't make sense: it's always 1.

2
votes

The issue here is your attempting to use C-strings as arrays of characters, which is certainly allowed but it's a different behavior than using them as pointers to null-terminated strings. Doing hello[0] evaluates to the first character of the string, which is simply a usually 8-bit integer. A char is a value, it does not correspond to a memory address. The correct statement you want is

strcpy(str, hello);

For reference, if you want to get a string starting at some point in your string, you would do

strcpy(str, hello + 1);

Performing addition on a pointer evaluates to a pointer that is some n addresses forward in memory.

0
votes

The definition of strcpy takes two char pointers not the str[], hello[] arrays.

char *strcpy(char *destination, const char *source)