Konstantinos Tsirakos
Konstantinos Tsirakos

Reputation: 35

string and malloc...whats goes wrong?

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

int main() {

    int i, *x , size ;
    char name[100] , *y;

    printf("Give name: ");

    /* user gives name */
    gets(name);
    size = strlen(name);


    /* gets memory for exactly the name length */
    y=(char*)malloc(size*sizeof(char));

    for(i=0;i!='\0';i++) {

        /* corywrites the name */
        *(y+i)=name[i];
    }

    printf("%s" ,*y);
}

Upvotes: 0

Views: 91

Answers (3)

Bob Mazanec
Bob Mazanec

Reputation: 1121

You didn't tell us what problems/symptoms you're seeing...but for starters...

  • test name[i] != '\0' instead of i != '\0'
  • the length strlen(name) returns does not include the trailing null.
  • null-terminate y after the for loop:

So...

y=(char*)malloc((size + 1) * sizeof(char));

for(i=0; name[i] != '\0'; i++) {    
    /* copywrites the name */
    y[i] = name[i]; /* changed to array syntax */
 }
 y[size] = '\0';

 printf("%s", y);

Upvotes: 1

Bill Lynch
Bill Lynch

Reputation: 81926

  1. You didn't allocate enough memory for y. You need to allocate space for the number of characters in the string plus one more for the null terminating character.

    y = malloc(size + 1);
    
  2. Your loop condition is broken. You probably are looking to compare the ith value in the string:

    for (i=0; name[i]!='\0'; i++) {
    
  3. Instead of writing *(y+i), you should just write y[i]. It's more understandable and it has exactly the same semantics.

    for (i=0; name[i]!='\0'; i++) {
        y[i] = name[i];
    }
    
  4. You didn't null terminate y.

    y[size] = '\0';
    
  5. When printing a string, the argument is expected to be of type char *, not char. So:

    printf("%s", y);
    

Upvotes: 0

mukunda
mukunda

Reputation: 2995

If I would copy a string by hand it would look like:

int i;
for( i = 0; source[i]; i++ ) dest[i] = source[i]; // copy characters
dest[i] = 0; // append null terminator

When you allocate the string you need to add 1 for the null terminator, and after you copy the string, you also need to add the null terminator.

You have a problem where you are comparing i to '\0' which is the initial condition and it terminates immediately.

An easier way to copy a string is to use the strcpy function.

Upvotes: 0

Related Questions