C Изменить указатель массива на более крупный массив - PullRequest
0 голосов
/ 10 октября 2011

У меня есть массив внутри структуры, например, так:

    typedef struct mystruct{
        const char *myarr[30];
    } mystruct;

Мне нужно увеличить этот массив позже в программе до 60 элементов, создав новый массив, продублировав содержимое, а затем изменив myarr науказать на новый массив.

Я пробовал следующее:

const char newtable[n];
s->*myarr = newtable;

Но gcc жалуется:

error: incompatible types in assignment

Любые идеи относительно правильного способа достижения этой цели

Ответы [ 4 ]

3 голосов
/ 10 октября 2011

Предполагая, что вы действительно хотите, чтобы ваш массив содержал char * с, а не char с, вы должны определить свою структуру следующим образом:

typedef struct {
    const char **myarr;
    /* I assume you actually have more members here */
} mystruct;

и инициализируйте его так:

mystruct s;
s.myarr = (const char **) malloc(30 * sizeof(const char *));
if (!s.myarr) { /* handle out-of-memory condition somehow */ }

Затем вы можете позже расширить его с помощью realloc():

const char **tmp = (const char **) realloc(s.myarr, 60 * sizeof(const char *));
if (tmp) s.myarr = tmp;
else { /* handle out-of-memory condition somehow */ }

(Обратите внимание, что если realloc() вернет NULL, исходное значение s.myarr все равно будет действительным.)

1 голос
/ 10 октября 2011

Не размещайте его как массив внутри структуры.Просто оставьте его как указатель:

const char *myarr;

Тогда это будет работать:

const char newtable[n];
s->myarr = newtable;

Вы все еще можете использовать его как массив, например

char c = s->myarr[20];
0 голосов
/ 10 октября 2011

Таким образом, растущая область памяти во время выполнения должна действительно включать динамическое распределение памяти. Я бы предложил что-то вроде этого:

typedef mystruct {
   char *data;
} mystruct;

[...]

char *ptr = realloc(s->data, 60); // that will copy your previous data over
if (ptr != NULL) {
   s->data = ptr;
}

Я не думаю, что это должно быть намного сложнее, чем на самом деле ... особенно вам следует избегать статического объявления массива из 60 элементов в разделе .data / .rodata ...

Надеюсь, это поможет,

0 голосов
/ 10 октября 2011

Вы объявляете массив указателей, а не указатель на массив.

typedef struct { // no need mystruct here
    const char *myarr;
} mystruct;

const char newtable[60];
s->myarr = newtable;

Но const char *myarr отличается от const char (*myarr)[30], и вы фактически не создали новый массив с помощью const char newtable[60];, вам может понадобиться malloc вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...