strdup() – what does it do in C?

Exactly what it sounds like, assuming you’re used to the abbreviated way in which C and UNIX assigns words, it duplicates strings 🙂 Keeping in mind it’s actually not part of the current (C17) ISO C standard itself(a) (it’s a POSIX thing), it’s effectively doing the same as the following code: char *strdup(const char *src) … Read more

How do I create an array of strings in C?

If you don’t want to change the strings, then you could simply do const char *a[2]; a[0] = “blah”; a[1] = “hmm”; When you do it like this you will allocate an array of two pointers to const char. These pointers will then be set to the addresses of the static strings “blah” and “hmm”. … Read more

What does a type followed by _t (underscore-t) represent?

As Douglas Mayle noted, it basically denotes a type name. Consequently, you would be ill-advised to end variable or function names with ‘_t‘ since it could cause some confusion. As well as size_t, the C89 standard defines wchar_t, off_t, ptrdiff_t, and probably some others I’ve forgotten. The C99 standard defines a lot of extra types, … Read more

Why do I get a segmentation fault when writing to a “char *s” initialized with a string literal, but not “char s[]”?

See the C FAQ, Question 1.32 Q: What is the difference between these initializations? char a[] = “string literal”; char *p = “string literal”; My program crashes if I try to assign a new value to p[i]. A: A string literal (the formal term for a double-quoted string in C source) can be used in … Read more

What is a bus error? Is it different from a segmentation fault?

Bus errors are rare nowadays on x86 and occur when your processor cannot even attempt the memory access requested, typically: using a processor instruction with an address that does not satisfy its alignment requirements. Segmentation faults occur when accessing memory which does not belong to your process. They are very common and are typically the … Read more

When should I use mmap for file access?

mmap is great if you have multiple processes accessing data in a read only fashion from the same file, which is common in the kind of server systems I write. mmap allows all those processes to share the same physical memory pages, saving a lot of memory. mmap also allows the operating system to optimize … Read more

Removing trailing newline character from fgets() input

Perhaps the simplest solution uses one of my favorite little-known functions, strcspn(): buffer[strcspn(buffer, “\n”)] = 0; If you want it to also handle ‘\r’ (say, if the stream is binary): buffer[strcspn(buffer, “\r\n”)] = 0; // works for LF, CR, CRLF, LFCR, … The function counts the number of characters until it hits a ‘\r’ or … Read more

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)