Freeing strings in C

前端 未结 6 1520
忘掉有多难
忘掉有多难 2021-02-03 11:26

If I would write:

char *a=malloc(sizeof(char)*4);
a=\"abc\";
char *b=\"abc\";

do I need to free this memory, or is it done by my system?

相关标签:
6条回答
  • 2021-02-03 11:31

    You've got a memory leak here. When you set a="abc", you're not filling the memory you just allocated, you're reassigning the pointer to point to the static string "abc". b points to the same static string.

    What you want instead is strncpy(a, "abc", 4), which will copy the contents of "abc" into the memory you allocated (which a points to).

    Then you would need to free it when finished.

    0 讨论(0)
  • 2021-02-03 11:31

    yes, you need to free the memory returned by malloc.

    0 讨论(0)
  • 2021-02-03 11:33

    Yes, it will cause a memory leak. The system could not handle the case.

    0 讨论(0)
  • 2021-02-03 11:39

    Simple answer yes,no. Also your code is buggy.

    Concrete answer:

    char *a=malloc(sizeof(char)*4);
    

    You allocate memory so you should free it.

    a="abc";
    

    This assigns a pointer to a constant string to your char* a, by doing so you loose the pointer to the memory allocated in the first line, you should never free constant strings.

    Use strcpy(a,"abc"); instead of a="abc"; to move the string into your allocated memory.

    0 讨论(0)
  • 2021-02-03 11:42

    In your situation you won't have any way to free the dynamic allocated memory because you are losing the reference to it.

    Try this out:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
      char *a=(char*)malloc(sizeof(char)*4);
      printf("Before: %p\n",a);
      a = "abc";
      printf("After: %p\n",a);
      free(a);
      char *b = "abc";
    
      return 0;
    }
    

    You will obtain

    Before: 0x100100080
    After: 0x100000f50
    

    You will see that the two pointers are different. This because the string literal "abc" is placed into data sector of the binary files and when you do

    a = "abc"
    

    you are changing the pointer of a to point to the constant literal string "abc" and you are losing the previously allocated memory. Calling free on a is not correct anymore, just because it won't point to a valid dynamically allocated address anymore. To preserve the pointer and be able to free it you should copy the string with

    strncpy(a, "abc", 4)
    

    This will effectively copy characters from the literal to the dynamically allocated method, preserving the original pointer.

    0 讨论(0)
  • 2021-02-03 11:43

    You cannot assign string in this way with C

    a = "abc"
    

    However if you use malloc then you have to use free, like this

    free(a);
    

    But pay attention if you use free(a) in your example you get an error. Because after the malloc you change the pointer a value to the static string "abc"; So the next free(a) try to free a static data. And you get the error.

    0 讨论(0)
提交回复
热议问题