c - Free first element of array -
when allocate array using malloc
, there way free first element(s) of array?
a small example:
#include <stdlib.h> #include <string.h> int main() { char * = malloc(sizeof(char) * 8); strcpy(a, "foo bar"); // how have this. char * b = malloc(sizeof(char) * 7); strcpy(b, a+1); free(a); free(b); }
is there way free first char of a
, can use rest of string using a+1
?
if want remove first character of a
, use memmove()
move remainder of characters in string left 1, , use realloc()
shrink allocation if desired:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char * = malloc(sizeof(char) * 8); strcpy(a, "foo bar"); puts(a); size_t rest = strlen(a); memmove(a, a+1, rest); /* if must reallocate */ char *temp = realloc(a, rest); if (temp == null) { perror("unable reallocate"); exit(exit_failure); } = temp; puts(a); free(a); return 0; }
update
@chux has made couple of good points in the comments.
first, instead of exiting on failure in realloc()
, may better continue without reassigning temp
a
; after all, a
point expected string anyway, allocated memory little larger necessary.
second, if input string empty, rest
0. leads problems realloc(a, rest)
. 1 solution check rest == 0
before modifying string pointed a
.
here more general version of above code incorporates these suggestions:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char *s = "foo bar"; char *a = malloc(sizeof *a * (strlen(s) + 1)); strcpy(a, s); puts(a); size_t rest = strlen(a); /* don't if empty string */ if (rest) { memmove(a, a+1, rest); /* if must reallocate */ char *temp = realloc(a, rest); if (temp) { = temp; } } puts(a); free(a); return 0; }
Comments
Post a Comment