summaryrefslogtreecommitdiff
path: root/2/homework/implement_calloc.c
diff options
context:
space:
mode:
authorMike Vink <mike@pionative.com>2024-05-22 08:49:29 +0200
committerMike Vink <mike@pionative.com>2024-05-22 08:49:29 +0200
commit51169f5f9ab178a4ddfe9dac461405a71c9c0f94 (patch)
tree0b6bb0c6c31ee27361b28e2c5993f362c1cc95e2 /2/homework/implement_calloc.c
parent77f19e4a89d8dec97930c5e237139734c5fb3365 (diff)
organise
Diffstat (limited to '2/homework/implement_calloc.c')
-rw-r--r--2/homework/implement_calloc.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/2/homework/implement_calloc.c b/2/homework/implement_calloc.c
new file mode 100644
index 0000000..62c3804
--- /dev/null
+++ b/2/homework/implement_calloc.c
@@ -0,0 +1,28 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+void *my_calloc(size_t nmemb, size_t size) {
+ if (nmemb == 0 || size == 0) {
+ return NULL;
+ }
+ /* Check if invariant of multiplication is broken by overflow */
+ size_t membytes = nmemb * size;
+ if (membytes/nmemb != size) {
+ return NULL;
+ }
+ void *mem_or_null = malloc(membytes);
+ if (mem_or_null == NULL) {
+ return NULL;
+ }
+
+ return memset(mem_or_null, 0, membytes);
+}
+
+int main() {
+ char *buf = my_calloc(10, 15);
+ int i;
+ for (i=0; i<10*15; ++i)
+ printf("%c", 97 + buf[i]);
+ return 0;
+}