Выдвижение аргумента

Я не могу понять, почему test не передается должным образом в test1

#include <Arduino.h>

char *test1;
char *status_reply(char *test) {
        int ans_rel = 1;
        int ans_led = 0;
        int ans_sw = 1;
        sprintf(test,"%d%d%d",ans_rel,ans_sw,ans_led);
        Serial.println(test);
}

void setup() {
        Serial.begin(9600);
        status_reply(test1);
        Serial.println(test1);
}

void loop() {
        // put your main code here, to run repeatedly:
}

, 👍-1

Обсуждение

Комментируя ответ на ваш предыдущий вопрос, я посоветовал вам прочитать раздел [Массивы и указатели](http://c-faq.com/aryptr/) FAQ по C. Судя по этим новым вопросам, похоже, вы этого не сделали. _Пожалуйста, прочтите его!_ Иначе вы потратите много времени, задавая здесь связанные (и не по теме) вопросы., @Edgar Bonet

@EdgarBonet ну я это читал. Должен сказать, что основная цель или мотивация объявления char как char* - совершенно неясна, @Guy . D

Чтобы было ясно - я понимаю технические детали таких определений, но не когда или почему использовать каждое из них. Это совсем не похоже на Python, @Guy . D


1 ответ


Лучший ответ:

2

Это не про Arduino. Это про C. Теперь у вас есть только указатель на char. Вам нужно выделить память для c-строки.

символ test1[128];

Если вы передадите указатель в sprintf, функция запишет в память, куда указывает указатель. Что-то где-то в памяти будет перезаписано, и последующий print выведет строку, но позже память будет использована для чего-то другого, и ваша c-строка исчезнет.

,

Спасибо. Я что-то упускаю: 1) В любом другом случае, если бы я инициализировал char *test1="hello world" в начале и вывел Serial.println(test1) - я бы получил правильное значение. 2) В коде здесь - когда я создаю test внутри, он печатает его, как и ожидалось, но не передает его значение в test2?, @Guy . D

char *test1="hello world" будет указателем на глобальную выделенную константную c-строку и должна быть const char *test1="hello world". Я улучшил ответ., @Juraj