#include <stdlib.h>
#include <stdio.h>
int main()
{
/* The compiler allocates space for "Hello" and '\0' (5 + 1 chars)
* and stores the address in aString1.
*/
const char *aString1 = "Hello";
/* The compiler allocates 10 chars and initializes
* it with "World" (and the '\0' for terminator).
*/
const char aString2[10] = "World";
/* The compiler determines length of initializer "I'm here."
* (9 + 1) and allocates the array of appropriate size.
*/
const char aString3[] = "I'm here.";
/* allocate storage for array (3 const char*) */
#if 0 /* the usual way */
const char **array
= malloc(3 * sizeof (const char*)); #else /* how Matheus wants to do it */
const char **array = NULL;
array
= realloc(array
, 3 * sizeof (const char*));#endif /* 0 */
/* assign contents (using it like an array) */
array[0] = aString1;
array[1] = aString2;
array[2] = aString3;
/* apply array to another variable array2 */
const char **array2 = array; /* assigns the address only */
/* use it: */
printf("array2[0]: '%s', array2[1]: '%s', array2[2]: '%s'\n", array2[0], array2[1], array2[2]);
/* throw away storage of array (and array2) */
/* Attention! array, array2 become wild pointers at this point
* and may not be accessed (except new, valid addresses are assigned).
* However, aString1, aString2, aString3 are still intact.
*/
printf("aString1: '%s', aString2: '%s', aString3: '%s'\n", aString1, aString2, aString3);
/* done */
return 0;
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KCmludCBtYWluKCkKewogIC8qIFRoZSBjb21waWxlciBhbGxvY2F0ZXMgc3BhY2UgZm9yICJIZWxsbyIgYW5kICdcMCcgKDUgKyAxIGNoYXJzKQogICAqIGFuZCBzdG9yZXMgdGhlIGFkZHJlc3MgaW4gYVN0cmluZzEuCiAgICovCiAgY29uc3QgY2hhciAqYVN0cmluZzEgPSAiSGVsbG8iOwogIC8qIFRoZSBjb21waWxlciBhbGxvY2F0ZXMgMTAgY2hhcnMgYW5kIGluaXRpYWxpemVzCiAgICogaXQgd2l0aCAiV29ybGQiIChhbmQgdGhlICdcMCcgZm9yIHRlcm1pbmF0b3IpLgogICAqLwogIGNvbnN0IGNoYXIgYVN0cmluZzJbMTBdID0gIldvcmxkIjsKICAvKiBUaGUgY29tcGlsZXIgZGV0ZXJtaW5lcyBsZW5ndGggb2YgaW5pdGlhbGl6ZXIgIkknbSBoZXJlLiIKICAgKiAoOSArIDEpIGFuZCBhbGxvY2F0ZXMgdGhlIGFycmF5IG9mIGFwcHJvcHJpYXRlIHNpemUuCiAgICovCiAgY29uc3QgY2hhciBhU3RyaW5nM1tdID0gIkknbSBoZXJlLiI7CiAgLyogYWxsb2NhdGUgc3RvcmFnZSBmb3IgYXJyYXkgKDMgY29uc3QgY2hhciopICovCiNpZiAwIC8qIHRoZSB1c3VhbCB3YXkgKi8KICBjb25zdCBjaGFyICoqYXJyYXkgPSBtYWxsb2MoMyAqIHNpemVvZiAoY29uc3QgY2hhciopKTsKI2Vsc2UgLyogaG93IE1hdGhldXMgd2FudHMgdG8gZG8gaXQgKi8KICBjb25zdCBjaGFyICoqYXJyYXkgPSBOVUxMOwogIGFycmF5ID0gcmVhbGxvYyhhcnJheSwgMyAqIHNpemVvZiAoY29uc3QgY2hhciopKTsKI2VuZGlmIC8qIDAgKi8KICAvKiBhc3NpZ24gY29udGVudHMgKHVzaW5nIGl0IGxpa2UgYW4gYXJyYXkpICovCiAgYXJyYXlbMF0gPSBhU3RyaW5nMTsKICBhcnJheVsxXSA9IGFTdHJpbmcyOwogIGFycmF5WzJdID0gYVN0cmluZzM7CiAgLyogYXBwbHkgYXJyYXkgdG8gYW5vdGhlciB2YXJpYWJsZSBhcnJheTIgKi8KICBjb25zdCBjaGFyICoqYXJyYXkyID0gYXJyYXk7IC8qIGFzc2lnbnMgdGhlIGFkZHJlc3Mgb25seSAqLwogIC8qIHVzZSBpdDogKi8KICBwcmludGYoImFycmF5MlswXTogJyVzJywgYXJyYXkyWzFdOiAnJXMnLCBhcnJheTJbMl06ICclcydcbiIsCiAgICBhcnJheTJbMF0sIGFycmF5MlsxXSwgYXJyYXkyWzJdKTsKICAvKiB0aHJvdyBhd2F5IHN0b3JhZ2Ugb2YgYXJyYXkgKGFuZCBhcnJheTIpICovCiAgZnJlZShhcnJheSk7CiAgLyogQXR0ZW50aW9uISBhcnJheSwgYXJyYXkyIGJlY29tZSB3aWxkIHBvaW50ZXJzIGF0IHRoaXMgcG9pbnQKICAgKiBhbmQgbWF5IG5vdCBiZSBhY2Nlc3NlZCAoZXhjZXB0IG5ldywgdmFsaWQgYWRkcmVzc2VzIGFyZSBhc3NpZ25lZCkuCiAgICogSG93ZXZlciwgYVN0cmluZzEsIGFTdHJpbmcyLCBhU3RyaW5nMyBhcmUgc3RpbGwgaW50YWN0LgogICAqLwogIHByaW50ZigiYVN0cmluZzE6ICclcycsIGFTdHJpbmcyOiAnJXMnLCBhU3RyaW5nMzogJyVzJ1xuIiwKICAgIGFTdHJpbmcxLCBhU3RyaW5nMiwgYVN0cmluZzMpOwogIC8qIGRvbmUgKi8KICByZXR1cm4gMDsKfQo=