#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void dump(char **array, size_t len) {
for(size_t i
=0; i
<len
; i
++) printf("%03d : %s\n",i
,*(array
+i
)); }
void p2p() {
const char *sample_str = "abc";
const size_t initial_max = 50; // изначально предполагаем, что этого хватит
const size_t real_life_max = 350; // жизнь показала, что нужно вот столько
size_t allocated = initial_max;
char **my_array
= (char**)calloc(allocated
, sizeof(char*)); // выделяем предполагаемый минимум if (my_array != NULL) {
// программа начинает работать в жесткой реальности
for (size_t i = 0; i < real_life_max; i++) {
if (i >= allocated) {
// принимаем решение увеличивать выделенную память
allocated = real_life_max;
if ((my_array
= realloc(my_array
, allocated
* sizeof(char*))) == NULL
) { }
}
my_array
[i
] = (char*)calloc(strlen(sample_str
)+1,sizeof(char)); if (my_array[i] == NULL) {
}
memmove(my_array
[i
], sample_str
, strlen(sample_str
)*sizeof(char)); }
} else {
}
// печатаем всю эту шляпу
dump(my_array,allocated);
// free
for (size_t i
= 0; i
< real_life_max
; i
++) free(*(my_array
+i
)); }
int main(void) {
p2p();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKdm9pZCBkdW1wKGNoYXIgKiphcnJheSwgc2l6ZV90IGxlbikgewogIGZvcihzaXplX3QgaT0wOyBpPGxlbjsgaSsrKSBwcmludGYoIiUwM2QgOiAlc1xuIixpLCooYXJyYXkraSkpOwp9Cgp2b2lkIHAycCgpIHsKICBjb25zdCBjaGFyICpzYW1wbGVfc3RyID0gImFiYyI7CiAgY29uc3Qgc2l6ZV90IGluaXRpYWxfbWF4ID0gNTA7IC8vINC40LfQvdCw0YfQsNC70YzQvdC+INC/0YDQtdC00L/QvtC70LDQs9Cw0LXQvCwg0YfRgtC+INGN0YLQvtCz0L4g0YXQstCw0YLQuNGCCiAgY29uc3Qgc2l6ZV90IHJlYWxfbGlmZV9tYXggPSAzNTA7IC8vINC20LjQt9C90Ywg0L/QvtC60LDQt9Cw0LvQsCwg0YfRgtC+INC90YPQttC90L4g0LLQvtGCINGB0YLQvtC70YzQutC+CiAgc2l6ZV90IGFsbG9jYXRlZCA9IGluaXRpYWxfbWF4OwogIGNoYXIgKipteV9hcnJheSA9IChjaGFyKiopY2FsbG9jKGFsbG9jYXRlZCwgc2l6ZW9mKGNoYXIqKSk7IC8vINCy0YvQtNC10LvRj9C10Lwg0L/RgNC10LTQv9C+0LvQsNCz0LDQtdC80YvQuSDQvNC40L3QuNC80YPQvAogIGlmIChteV9hcnJheSAhPSBOVUxMKSB7CiAgICAvLyDQv9GA0L7Qs9GA0LDQvNC80LAg0L3QsNGH0LjQvdCw0LXRgiDRgNCw0LHQvtGC0LDRgtGMINCyINC20LXRgdGC0LrQvtC5INGA0LXQsNC70YzQvdC+0YHRgtC4CiAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlYWxfbGlmZV9tYXg7IGkrKykgewogICAgICBpZiAoaSA+PSBhbGxvY2F0ZWQpIHsKICAgICAgICAvLyDQv9GA0LjQvdC40LzQsNC10Lwg0YDQtdGI0LXQvdC40LUg0YPQstC10LvQuNGH0LjQstCw0YLRjCDQstGL0LTQtdC70LXQvdC90YPRjiDQv9Cw0LzRj9GC0YwKICAgICAgICBhbGxvY2F0ZWQgPSByZWFsX2xpZmVfbWF4OwogICAgICAgIGlmICgobXlfYXJyYXkgPSByZWFsbG9jKG15X2FycmF5LCBhbGxvY2F0ZWQgKiBzaXplb2YoY2hhciopKSkgPT0gTlVMTCkgewogICAgICAgICAgcHJpbnRmKCJyZWFsbG9jIGVycm9yIVxuIik7CiAgICAgICAgICBleGl0KC0xKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbXlfYXJyYXlbaV0gPSAoY2hhciopY2FsbG9jKHN0cmxlbihzYW1wbGVfc3RyKSsxLHNpemVvZihjaGFyKSk7CiAgICAgIGlmIChteV9hcnJheVtpXSA9PSBOVUxMKSB7CiAgICAgICAgcHJpbnRmKCJjYWxsb2MtMiBlcnJvciFcbiIpOwogICAgICAgIGV4aXQoLTEpOwogICAgICB9CiAgICAgIG1lbW1vdmUobXlfYXJyYXlbaV0sIHNhbXBsZV9zdHIsIHN0cmxlbihzYW1wbGVfc3RyKSpzaXplb2YoY2hhcikpOwogICAgfQogIH0gZWxzZSB7CiAgICBwcmludGYoImNhbGxvYy0xIGVycm9yIVxuIik7CiAgICBleGl0KC0xKTsKICB9CiAgLy8g0L/QtdGH0LDRgtCw0LXQvCDQstGB0Y4g0Y3RgtGDINGI0LvRj9C/0YMKICBkdW1wKG15X2FycmF5LGFsbG9jYXRlZCk7CiAgLy8gZnJlZQogIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVhbF9saWZlX21heDsgaSsrKSBmcmVlKCoobXlfYXJyYXkraSkpOwogIGZyZWUobXlfYXJyYXkpOwp9CgppbnQgbWFpbih2b2lkKSB7CiAgcDJwKCk7CiAgcmV0dXJuIDA7Cn0K