Alternative solution for adding attributes to a character:
Create an Array that stores both an Attribute ID and a Value for that attribute. You can track attribute names in a separate array, or using Ian M's Matrix Utilities "Key to Value lookup tables."
Once all attributes for a character have been added to the attribute array, copy the array to a memblock. Next, add the memblock to the character object (assuming this is a 3d game).
Pulling memblocks from objects can slow things down, so while an object is "active" or in "active range" (a range where it can be expected the attributes will be checked), keep the memblock in memory. Otherwise, the memblocks can be deleted once stored in the object.
=====================

Next issue:
Besides storing values and corresponding meaningful attribute names for the user, how will the values be used? Simply storing a value with a unique name is not particularly useful. Some process must occur with that value in order for it to be useful. For example, Hit Points determine if a character is alive or dead. When processing a Hit Points attribute value, a check is made to determine if the value is greater than 0, indicating the character is alive and can perform the next action. Monetary attributes are checked against prices of goods.
Let's suppose the user creates a "Banana" attribute. Sure, the user can freely name the attribute and supply a value. But what will the program do with it? A less extreme example would be creating an Agility attribute. Dexterity might be defined, and Agility would pretty much be the same thing. But how would the code know the difference between Agility and Banana? It wouldn't unless a function or subroutine was specifically coded to accept these attribute names.
If anyone can get around that roadblock, I would really like know how. It is a problem I have been considering for a very long time.