2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Язык С: область видимости литералов, static и указатели
Сообщение21.06.2023, 11:31 
Аватара пользователя


18/02/20
228
Пишу программу на C.

Определен глобальный буфер указателей на строки:
char *(buff_fifo[FIFO_SIZE]);

Функция, записывающая в буфер строку:
void lcd_string(char *str) {
. . .
buff_fifo[head] = str;
head++;
. . .
}

У меня сомнения по поводу корректности вызовов:

void work_screen() {
static char str[] = {0x32, 0x0c, 0};
. . .
lcd_string("Hello, world!");
. . .
lcd_string(str);
. . .
}

Литерал "Hello,world!" виден только внутри функции work_screen(),
значит, после выхода из функции в буфере fifo будет указатель
неизвестно на что?
Можно ли как-то выкрутиться, чтобы не заводить кучу глобальных
строк-литералов, а потом ссылаться на них, получая плохо читаемый код?

А корректен ли второй вызов со строкой str?

 Профиль  
                  
 
 Re: Язык С: область видимости литералов, static и указатели
Сообщение21.06.2023, 11:37 
Заслуженный участник
Аватара пользователя


16/07/14
9143
Цюрих
Всё в порядке, у литералов static storage duration, они переживают выход из функции.
Со вторым вызовом тоже всё хорошо.

 Профиль  
                  
 
 Re: Язык С: область видимости литералов, static и указатели
Сообщение21.06.2023, 11:45 
Аватара пользователя


18/02/20
228
Спасибо.
А где можно об этом почитать? В учебниках ничего не нахожу. Стандарт на компилятор изучать? Как-то не очень хочется.

 Профиль  
                  
 
 Re: Язык С: область видимости литералов, static и указатели
Сообщение21.06.2023, 11:50 
Заслуженный участник
Аватара пользователя


16/07/14
9143
Цюрих
Стандарт, только не компилятора, а языка.
К сожалению, других хороших способов нет - во всех остальных местах, включая популярные учебники, встречается неправда.
Есть https://en.cppreference.com/w/, где по месту переписан стандарт в чуть более читаемом виде, но вроде без ошибок. Но он для С++, который, вопреки мифу, не является надмножеством С, и в котором запрещены некоторые разрешенные в С вещи.

Но при наличии некоторого опыта работать со стандартом не так уж тяжело. Например ответ на Ваш первый вопрос находится просто поиском "string literal" в тексте.

 Профиль  
                  
 
 Re: Язык С: область видимости литералов, static и указатели
Сообщение21.06.2023, 12:03 
Аватара пользователя


18/02/20
228
Что ж, будем грызть.
А еще можно спросить у знающих людей! :D

 Профиль  
                  
 
 Re: Язык С: область видимости литералов, static и указатели
Сообщение22.06.2023, 01:11 
Заслуженный участник


18/09/21
1756
А ещё для надёжности можно не буфер указателей, а буфер строк. И туда копировать строки.
Это для универсальности. Вдруг в другой раз будет вызов этой функции с указателем на локальный массив char (который в стэке лежит и пропадёт после выхода из функции).

 Профиль  
                  
 
 Re: Язык С: область видимости литералов, static и указатели
Сообщение24.06.2023, 23:26 
Аватара пользователя


18/02/20
228
zykov в сообщении #1598513 писал(а):
можно не буфер указателей, а буфер строк.

Этот вариант был сразу отброшен. У меня микроконтроллер, каждая микросекунда важна.

 Профиль  
                  
 
 Re: Язык С: область видимости литералов, static и указатели
Сообщение15.07.2023, 19:16 
Аватара пользователя


28/10/21
100
peg59 в сообщении #1598387 писал(а):
Язык С: область видимости литералов, static и указатели


Понятие области видимости (scope) применимо только к идентификаторам, то есть к именам переменных, типов и т.п. У строкового литерала нет имени. Поэтому ни о какой "области видимости" для строкового литерала речи идти не может.

Ваш вопрос не об области видимости, а времени жизни (lifetime) строкового литерала. Временя жизни - совершенно иная концепция, никак не связанная с областью видимости. Строковые литералы в С имеют статический класс хранения (static storage duration), из чего следует что его время жизни является "вечным", то есть объект существует от начала до конца выполнения программы.

 Профиль  
                  
 
 Correct C Program
Сообщение29.09.2023, 14:09 
Аватара пользователя


20/12/22
14
Haldwani
Well, there are some issues with your code, you can try below code to fix the issue.

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define FIFO_SIZE 10

char *buff_fifo[FIFO_SIZE];
int head = 0;

void lcd_string(char *str) {
    if (head < FIFO_SIZE) {
        // Allocate memory for the string
        buff_fifo[head] = malloc(strlen(str) + 1);
        if (buff_fifo[head] != NULL) {
            strcpy(buff_fifo[head], str);
            head++;
        } else {
            // Handle memory allocation failure
        }
    } else {
        // Handle buffer overflow
    }
}

void free_fifo() {
    for (int i = 0; i < head; i++) {
        free(buff_fifo[i]); // Free the allocated memory
    }
}

void work_screen() {
    static char str[] = {0x32, 0x0c, 0};

    lcd_string("Hello, world!");

    lcd_string(str);

    // Ensure you free the memory when you're done
    free_fifo();
}

int main() {
    work_screen();
    return 0;
}


Thanks

 Профиль  
                  
 
 Re: Correct C Program
Сообщение07.10.2023, 01:09 
Аватара пользователя


28/10/21
100
gulshan212 в сообщении #1611731 писал(а):
Well, there are some issues with your code, you can try below code to fix the issue.


Well, as it has already been stated above, there are no issues with the OP's code. So, it is not entirely clear what you are trying to fix.

 Профиль  
                  
 
 Re: Язык С: область видимости литералов, static и указатели
Сообщение07.10.2023, 10:51 
Заслуженный участник


12/08/10
1677
TheRuinedMap в сообщении #1612802 писал(а):
Well, as it has already been stated above, there are no issues with the OP's code. So, it is not entirely clear what you are trying to fix.

Человека, как и меня, пугают указатели на локальные переменные. А слово Static в старых учебниках по C не упоминается. Оно добавлено позже?

 Профиль  
                  
 
 Re: Язык С: область видимости литералов, static и указатели
Сообщение08.10.2023, 00:15 
Аватара пользователя


28/10/21
100
Null в сообщении #1612821 писал(а):
А слово Static в старых учебниках по C не упоминается. Оно добавлено позже?


Странно. В первом издании K&R C class of storage static (в том числе для локальных переменных) присутствует во всей красе.

Цитата:
4.6 Static Variables
Static variables are a third class of storage, in addition to the extern and automatic that we have already met.
static variables may be either internal or external. Internal static variables are local to a particular function just as automatic variables are, but unlike automatics, they remain in existence rather than coming and going each time the function is activated. This means that internal static variables provide private, permanent storage in a function. Character strings that appear within a function, such as the arguments of printf, are internal static.

 Профиль  
                  
 
 Re: Язык С: область видимости литералов, static и указатели
Сообщение08.10.2023, 07:44 
Заслуженный участник


12/08/10
1677

(Оффтоп)

TheRuinedMap в сообщении #1612911 писал(а):
Странно.
Да. Плохо читал учебник Кернигана, Ритчи. Оно там есть. Просто не использовал.

 Профиль  
                  
 
 Re: Язык С: область видимости литералов, static и указатели
Сообщение10.10.2023, 09:12 
Аватара пользователя


07/02/12
1433
Питер
peg59 в сообщении #1599030 писал(а):
Этот вариант был сразу отброшен. У меня микроконтроллер, каждая микросекунда важна

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group