diff dowa/d_memory.c @ 87:d39e8860a361

[Dowa] There was alignment issues rea hash key
author June Park <parkjune1995@gmail.com>
date Thu, 01 Jan 2026 14:25:17 -0800
parents 4532ce6d9eb8
children 655ea0b661fd
line wrap: on
line diff
--- a/dowa/d_memory.c	Thu Jan 01 14:05:34 2026 -0800
+++ b/dowa/d_memory.c	Thu Jan 01 14:25:17 2026 -0800
@@ -109,14 +109,19 @@
     current_capacity = 0;
   }
 
-  if (current_capacity >= minimum_capacity && p_array != NULL)
+  // Calculate needed capacity: if minimum_capacity is 0, we need room for at least one more element
+  size_t needed_capacity = minimum_capacity;
+  if (p_array && needed_capacity == 0)
+    needed_capacity = p_header->length + 1;
+
+  if (current_capacity >= needed_capacity && p_array != NULL)
     return p_array;
 
   new_capacity = current_capacity * 2;
   if (new_capacity < 4)
     new_capacity = 4;
-  if (new_capacity < minimum_capacity)
-    new_capacity = minimum_capacity;
+  if (new_capacity < needed_capacity)
+    new_capacity = needed_capacity;
 
   size_t total_size = sizeof(Dowa_Array_Header) + (element_size * new_capacity);
 
@@ -479,7 +484,8 @@
 
   memcpy(p_key_copy, p_key, key_size);
 
-  memcpy(p_new_element, &p_key_copy, sizeof(char*));
+  // Store the pointer value (use memcpy to avoid alignment issues)
+  memcpy(p_new_element, &p_key_copy, sizeof(p_key_copy));
   p_header->length++;
 
   // Try to insert into hash table - if it fails, rehash and retry
@@ -497,7 +503,7 @@
       // Restore array state
       new_index = (uint32)p_header->length;
       p_new_element = (char*)p_map + (new_index * element_size);
-      memcpy(p_new_element, &p_key_copy, sizeof(char*));
+      memcpy(p_new_element, &p_key_copy, sizeof(p_key_copy));
       p_header->length++;
     }