Является ли обычной практикой повторное использование одного и того же имени буфера для разных вещей в C? - PullRequest
11 голосов
/ 16 августа 2010

Например, предположим, у меня есть буфер с именем char journal_name[25], который я использую для хранения названия журнала.Теперь предположим, что через несколько строк в коде я хочу сохранить чье-то имя в буфере.Должен ли я пойти char person_name[25] или просто использовать journal_name[25]?

Беда в том, что каждый, кто читает код (и я тоже через несколько недель), должен понять, journal_name теперь фактически person_name.

Но контраргумент состоит в том, что наличие двух буферов увеличивает использование пространства.Так что лучше использовать один.

Что вы думаете об этой проблеме?

Спасибо, Бода Кидо.

Ответы [ 7 ]

16 голосов
/ 16 августа 2010

Чтобы решить эту проблему способом C, если вы действительно не хотите тратить впустую память, используйте блоки для выделения буферов:

int main()
{
  {
    char journal_name[26];
    // use journal name
  }
  {
    char person_name[26];
    // use person name 
  }
}

Компилятор будет повторно использовать одну и ту же ячейку памяти для обоих, давая вам совершенно разборчивое имя.

В качестве альтернативы, назовите его name и используйте его для обоих <. <</p>

8 голосов
/ 16 августа 2010

Какой-то код здесь действительно в порядке. Однако пара моментов, на которые стоит обратить внимание:

Держите идентификатор отдельно от ваших объектов. Назовите это scratchpad или как угодно. Кроме того, по всей видимости, этот массив символов не выделяется динамически. Это означает, что вы должны выделить достаточно большой блокнот для повторного использования.

Еще лучший подход - это, вероятно, сделать ваши функции короче: в идеале одна функция должна делать одну вещь за раз. Посмотрим, сможете ли вы расстаться и все еще столкнуться с проблемой.

4 голосов
/ 16 августа 2010

В качестве альтернативы предыдущим (хорошим) ответам, как насчет

char buffer[25];

char* journal_name = buffer;

потом позже

char* person_name = buffer;

Будет ли это нормально?

3 голосов
/ 16 августа 2010

Если оба буфера являются автоматическими, почему бы не использовать это? Большинство компиляторов справятся с этим правильно при повторном использовании памяти. Но вы сохраняете читабельность.

{
    char journal_name[25];
    /*
        Your code which uses journal_name..
    */
}
{
    char person_name[25];
    /*
        Your code which uses person_name...
    */
}

Кстати, даже если ваш компилятор тупой и у вас очень мало памяти, вы можете использовать объединение, но для удобства чтения сохраняйте разные имена. Использование одной и той же переменной - худший способ.

2 голосов
/ 16 августа 2010

Вы всегда должны (ну, если у вас очень нехватка памяти) стремиться к удобочитаемости и удобству обслуживания при написании кода по той причине, о которой вы указали в своем вопросе.

25 символов (если это не просто пример) не собирается «разорять банк», но если память имеет высокую цену, вы можете динамически выделить хранилище для journal_name, а затем освободить его, когда закончите. с ним, прежде чем динамически выделять хранилище для person_name. Хотя есть «издержки» указателя на массив.

Другой способ - использовать локальную область видимости для массивов:

void myMethod()
{
    ... some code
    {
        char journal_name[25];
        ... some more code
    }
    ... even more code
    {
        char person_name[25];
        ... yet more code
    }
}

Хотя даже с этим псевдокодом метод становится довольно длинным и выиграл бы от рефакторинга в подпрограммы, у которых не было бы этой проблемы.

2 голосов
/ 16 августа 2010

Пожалуйста, используйте person_name[25]. Никто не любит трудно читать код. Это не собирается делать много, если что-нибудь вообще для вашей программы с точки зрения памяти. Пожалуйста, просто сделайте это читабельным способом.

1 голос
/ 16 августа 2010

Если вас беспокоит память, и я сомневаюсь, что 25 байтов будут проблемой, но тогда вы можете просто использовать malloc и free, и тогда у вас просто есть дополнительные 4-8 байтов, используемых для указателя.

Но, как уже упоминалось, читабельность важна, и вы можете захотеть разбить вашу функцию так, чтобы два буфера использовались в функциях, которые фактически дают больше указаний относительно их использования.

UPDATE:

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

Итак, повторное использование буфера может быть полезным при чтении из сокетов или файлов, но вы хотите локализовать использование этого буфера, иначе у вас могут возникнуть условия гонки.

...