2013-08-15 2 views
7

я изо всех сил, чтобы исправить код сегодня, то я сталкиваюсь нечто похожее на:Выделяем память для структуры с указателем символов в C

typedef struct { 
int a; 
int b; 
int c; 
int d; 
char* word; 
} mystruct; 

int main(int argc, char **argv){ 

    mystruct* structptr = malloc(sizeof(mystruct)); 
    if (structptr==NULL) { 
     printf("ERROR!") 
     ... 
    } 
    ... 
    free(structptr); 

    return 0; 
} 

код был давая много ошибок памяти из-за того , что char* word - это строка переменной длины, а malloc не выделяет для этого достаточно памяти. Фактически это было только распределение 20 Bytes на все struct. Есть ли способ обойти эту проблему, не превращая char* в sth, как char word[50]?

+0

увидел, что у вас есть комментарий, но затем удалите его. Пожалуйста, отредактируйте свой вопрос с дополнительной информацией или отправьте второй вопрос. Существуют способы справиться с вектором 'char', который изменяется по длине. – JackCColeman

+0

Я добавил комментарий, после чего нашел ответ в комментариях ниже. Я считаю, что фиксированный размер буфера на самом деле является лучшим решением, поскольку слово будет представлять имя, а имена не должны быть длинными, как роман;). Спасибо за помощь.Мне просто очень интересно было выделить память для переменных строк, вот почему я спросил. Но в любом случае я собирался переключиться на массивы с фиксированной длиной. –

+0

в настоящее время занимает пространство (то есть ОЗУ), поэтому в большинстве случаев определение массива символов размером до 1024 не вызовет проблемы. Буферы ввода/вывода обычно намного больше, чем это. – JackCColeman

ответ

16

Вы выделяете только память для самой структуры. Сюда входит указатель на char, который составляет всего 4 байта на 32-битной системе, поскольку он является частью структуры. Он НЕ включает память для неизвестной длины строки, поэтому, если вы хотите иметь строку, вы также должны вручную выделить для нее память. Если вы просто копируете строку, вы можете использовать strdup(), который выделяет и копирует строку. Вы все равно должны освободить память.

mystruct* structptr = malloc(sizeof(mystruct)); 
structptr->word = malloc(mystringlength+1); 

.... 

free(structptr->word); 
free(structptr); 

Если вы не хотите, чтобы выделить память для строки самого, ваш единственный выбор, чтобы объявить массив фиксированной длиной в вашей структуре. Затем он будет частью структуры, и в него войдет sizeof(mystruct). Если это применимо или нет, это зависит от вашего дизайна.

+0

@ H2CO3, поразмыслите над тем, что вы считаете неправильным? – Devolus

+1

@ H2CO3, я не думаю, что Devolus ценит вашу точку зрения. – JackCColeman

+1

@JackCColeman, тем более, что не очень конструктивно критиковать любую информацию о том, что было бы неправильно. – Devolus

3

Добавьте второй malloc для любой длины (N), что необходимо для word

mystruct* structptr = malloc(sizeof(mystruct)); 

    structptr->word = malloc(sizeof(char) * N); 
-1

Использование word=malloc(128);

это выделит 128 байт вашего varible слова,

1

При выделении памяти structptr, указатель word в struct не имеет действительной памяти. Таким образом, вы либо malloc кусок памяти для word тоже, либо сделать word, указывают на другого персонажа.

4

как вы можете прочитать here вам нужно выделить char * отдельно:

mystruct* structptr = malloc(sizeof(mystruct)); 
structptr->word = malloc(sizeof(WhatSizeYouWant)); 
0

таНос внешняя структура будет только выделить 1 байт памяти указываемого *word, так как это тип «символ *». Если вы хотите выделить более 1 байт памяти, указываемой word, есть 2 варианта:

  1. Как то, что вы сказали, объявить его как char word[50] вместо `полукокса *»
  2. таНос/calloc (я лично предпочитаю calloc, избавляя вас от проблемы zeromemory, что очень важно ..) внешняя структура, затем malloc/calloc - внутренний word. Не забудьте также позвонить free в этом случае.
Смежные вопросы