this post was submitted on 17 Aug 2026
7 points (88.9% liked)
C Programming Language
1336 readers
1 users here now
Welcome to the C community!
C is quirky, flawed, and an enormous success.
... When I read commentary about suggestions for where C should go, I often think back and give thanks that it wasn't developed under the advice of a worldwide crowd.
... The only way to learn a new programming language is by writing programs in it.
- irc: #c
๐ https://en.cppreference.com/w/c
founded 3 years ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
view the rest of the comments
So there's a couple errors I can see in there: one which causes your issue here, and one that will cause another painful issue, unless you're lucky.
malloc(strlen(buffer + 1));is not the same asmalloc(strlen(buffer) + 1);. Your allocation is actually one byte shorter than your input string. This means yourstrcpywill copy a byte past the allocated buffer. Only bad things can come out of that, and they may not be noticeable at first.mallocis giving you back an address - call it0x0001- and promises to have at least the available size you requested. You promise to at some pointfreethat address. That address is stored intoline.strchrreturns a different address - one later in the string, specifically. Your loop continuously advanceslineto that new address plus one. So, at the end, you've been given an address, 0x0001, and you're trying to free some other address - e.g. 0x10de. That's why you can't free; you're freeing something other than what you malloc'd. You need to hold onto the actual address returned by malloc in another variable, and free that address specifically.For #1, I'd personally recommend taking a look at
strdupinstead ofmalloc+strcpy. It's identical functionally, so I invite you to wholly understand all three functions and understand when/why they're used, but when copying a string exactly,strdupis the way to go - and it removes the possibility of an errant+ 1. As part of the understanding, understand that the result ofstrdupdoes still need to be given tofreeeventually.As a general note, to provide maybe some clarity on "is it fine to not free strings" - strings don't really exist in C. That is, there's not some special thing that the system sees as a string. They're by convention - a string is a blob of non-
'\0'bytes that ends with'\0'. malloc and free do not know or care what you did with the bytes you received, and whenever you see a man page say that it does something with a string (copy, search, etc.), you can confidently substitute string with "blob of non-nul bytes ending with a nul byte". "string" just sounds nicer, and by convention, that's what we know a "C string" to be.