Find a powerset of a set in C
Just a review of a small portion of code:
PSet *pset = malloc(sizeof(PSet));
pset-&gt;data = malloc (sizeof(char *) * (1 &lt;&lt; sset-&gt;size));
pset-&gt;data[pset-&gt;size] = calloc(2, 1);

pset-&gt;size is not yet assigned a value. pset-&gt;data[pset-&gt;size] is a Bug.  @1201ProgramAlarm
sizeof(char *) --&gt; Is that the correct size?  I need to look for the declarations of pset up some lines and then the definition of PSet some 20 lines upstream.
Consider below instead - no need to check if the correct type.  The size is correct by inspection of this line alone.
pset-&gt;data = malloc(sizeof pset-&gt;data[0] * (1 &lt;&lt; sset-&gt;size));

Later code uses int for indexing and buffer size, yet could have used unsigned and incur no additional cost in performance.  To support unsigned, add u:
pset-&gt;data = malloc(sizeof pset-&gt;data[0] * (1u &lt;&lt; sset-&gt;size));


Redundant string length calculation
Compiler may not optimize the 2 strlen() calls into 1.  Recommend to do so by direct code.
//pset-&gt;data[pset-&gt;size] = calloc(strlen(pset-&gt;data[buffer]) + 2, sizeof(char));
//strcpy(pset-&gt;data[pset-&gt;size], pset-&gt;data[buffer]);
//pset-&gt;data[pset-&gt;size][strlen(pset-&gt;data[buffer])] = set-&gt;data[index];

size_t len = strlen(pset-&gt;data[buffer];
pset-&gt;data[pset-&gt;size] = calloc(len + 2, sizeof(char));
strcpy(pset-&gt;data[pset-&gt;size], pset-&gt;data[buffer]);  // or memcpy()
pset-&gt;data[pset-&gt;size][len] = set-&gt;data[index];  // re-use `len`


Use const for unchanged refenced data
It better conveys code's intent, allows for some optimizations and greater functionally usage.
// Set *initSet(char *str) {
Set *initSet(const char *str) {


Missing freeing of memory
For general usage of these routines, de-allocation routines are needed like uninitSet() and uninitPSet().