iT邦幫忙

0

char *ptr 函式間用法

c
    void main{
        \*
            ...
        */
        void *task_net = NULL;
        const char *wifi_set[2]={"wintech524","wintech524"};

        if (os_task_create(&task_net, ((const char*)"net config init"),net_config_thread,wifi_set/*NULL*/, 4096, 1) != 1) {
            printf("\n\r%s xTaskCreate(net config init) failed", __FUNCTION__);
            
            /*
            上面if 可以簡單想成
            net_config_thread(wifi_set);
            
            */
        }
    }
    void net_config_thread(const char *wifi_set[2])
    {	
        connect_net_by_at(wifi_set);
        /*
            ....
        */
        do{}while(1);
        os_task_delete(NULL);
    }
    void connect_net_by_at(const char *wifi_set[2]){
        const char *ssid=wifi_set[0];
        const char *pw=wifi_set[1];
        printf("\n SSID=%s \nPW=%s\n",ssid,pw);
        /*
            ....
        */
        printf("\n----------WIFI connected\n");
    }

想問一下為甚麼上面這個寫法會有問題?我最後的到的ssid跟pw是
SSID=@2� �z

PW=

單純是因為這個韌體的原因導致程式不work還是我邏輯錯誤呢?

我有在電腦上試過

void f1(const char *id[2]){
  const char *ssid,*pw;
  ssid=id[0];
  pw=id[1];
  printf("ssid=%s\n",ssid);
  printf("pw=%s\n",pw);
  id[0]="wintech524";       <<------
  id[1]="wintech524";       <<-------
  printf("---------------\n");
}
int main(void) {
  const char *id[2]={"test","test1"};
  f1(id);
  printf("%s\n",id[0]);
  return 0;
}

結果:
ssid=test
pw=test1
---------------
wintech524

雖然結果如我預期
但請問這樣的寫法是合法的嗎?

另外f1中對id[0]給一個新的常數字串,這個常數字串的記憶體會被分配到哪?不會因為離開f1而被回收嗎?

**後來有在PTT看到類似的提醒,理論上指標傳入函式能改值但是不能改他指到的地址 如下圖
https://ithelp.ithome.com.tw/upload/images/20210529/20130023gt6BMyS0dI.png
應該是會有問題吧? 雖然我記憶體不是malloc出來的
但我在repl.it上執行卻改了 有點搞不懂

**

同樣,我在晶片8720上執行 一段函式,並不如我預期

#define MQTT_HONEY_PUB_ALERT "ALERT"
#define MQTT_HONEY_PUB_TAG "TAG"
const char* pub_topic = "";
cJSON *IOTJSObject=NULL;
IOTJSObject = cJSON_CreateObject();
tag_data_transform_mqtt(IOTJSObject,pub_topic);
if(pub_topic!=""){...}
void tag_data_transform_mqtt(cJSON *IOTJSObject,const char *pTopic){
    if(tag_data1.groupC_button==0x01){
		pTopic=MQTT_HONEY_PUB_ALERT;
		...
	}
	else{
		pTopic=MQTT_HONEY_PUB_TAG;
        ...
	}

結果pub_topic永遠等於""

是因為甚麼呢?

DanSnow iT邦研究生 5 級 ‧ 2021-05-26 08:56:26 檢舉
你是不是該用 strcmp ,還有你那種宣告方式出來的字串 pub_topic 會是 const 吧,這樣執行時沒炸嗎
kagaya iT邦新手 5 級 ‧ 2021-05-26 09:30:39 檢舉
很久沒寫C了 不確定對不對
1. id[0]="wintech524";
應該不是用= 而是用memcpy之類的函式
2. char *id[2]={"test","test1"};
test長度只有4 wintech524超過4 你要把它塞進id[0]是不對的
kim85109 iT邦新手 5 級 ‧ 2021-05-26 14:49:09 檢舉
痾... 我是用char *ptr的形式 更正確寫法是const char *ptr 一個指向const char的指標 所以onst char *ptr[2] 是兩個指向const char指標 ,
strcmp前面變數要放char array吧

尚未有邦友回答

立即登入回答