ESP8266中关于C语言静态指针赋值问题(const char *)

一、介绍

之所以写这个博客是想记录下自己的愚蠢,还有就是基础知识的不牢固。当然还有在嵌入式系统中使用C的注意事项。先描述以下我所遇到的问题,和结构体有关系,在看esp8266_rtos_sdk的http_client这段例程的时候遇到的,我想动态的改变请求的地址,其中要先初始化一个结构体esp_http_client_config_t,它的声明是这样的:

/**
 * @brief HTTP configuration
 */
typedef struct {
    const char                  *url;                /*!< HTTP URL, the information on the URL is most important, it overrides the other fields below, if any */
    const char                  *host;               /*!< Domain or IP as string */
    int                         port;                /*!< Port to connect, default depend on esp_http_client_transport_t (80 or 443) */
    const char                  *username;           /*!< Using for Http authentication */
    const char                  *password;           /*!< Using for Http authentication */
    esp_http_client_auth_type_t auth_type;           /*!< Http authentication type, see `esp_http_client_auth_type_t` */
    const char                  *path;               /*!< HTTP Path, if not set, default is `/` */
    const char                  *query;              /*!< HTTP query */
    const char                  *cert_pem;           /*!< SSL Certification, PEM format as string, if the client requires to verify server */
    esp_http_client_method_t    method;                   /*!< HTTP Method */
    int                         timeout_ms;               /*!< Network timeout in milliseconds */
    bool                        disable_auto_redirect;    /*!< Disable HTTP automatic redirects */
    int                         max_redirection_count;    /*!< Max redirection number, using default value if zero*/
    http_event_handle_cb        event_handler;             /*!< HTTP Event Handle */
    esp_http_client_transport_t transport_type;           /*!< HTTP transport type, see `esp_http_client_transport_t` */
    int                         buffer_size;              /*!< HTTP buffer size (both send and receive) */
    void                        *user_data;               /*!< HTTP user_data context */
    bool                        is_async;                 /*!< Set asynchronous mode, only supported with HTTPS for now */
} esp_http_client_config_t;

我们要看的是url,它被声明成了静态的char类型的指针。当然在初始化之前,这个指针的地址和这个指针所指向的地址都是不存在的。我所遇到的bug就在这里,在没有分配指针地址的时候,就给了其一个指针指向的地址,也就是这个指针的值。下面在详细的讲一下。

二、错误代码

错误代码的错误原因就是在没有初始化的情况下赋值了,一开始以为自己是赋值方法错误,就换了好多种方法。甚至有些编译都通过了,最后把代码下载进去的时候,一运行就会导致模块重启。来看以下错误的尝试:

	/**
	*	以为定义了就初始化了,其实不然,定义了只是定义了,有一些空间还是不存在的,这个时候我应该打印下config .url所在的地址看一下,是否为空。
	*/
    char * url2="http://jxaummd.com:8080/test/getMqttInfo";
    esp_http_client_config_t config ;	
    config.event_handler = _http_event_handler;
    config.url=url2;
	/**
	*	maclloc 方法,忘记能不能编译通过了,反正最后还是错的,虽然config.url初始化成功了,但是config没有初始化成功 ,而且 config.event_handler这个操作,依然是在给一个空的空间放东西,编译不会错,运行肯定挂掉。
	*/
    char * url2="http://jxaummd.com:8080/test/getMqttInfo";
    esp_http_client_config_t config ;	
    config.event_handler = _http_event_handler;
    config.url= malloc(strlen(url2));
    strcpy(url,url2);

三、正确代码

既然是未初始化的问题,那么解决方案就出来了,先进行初始化再赋值操作呗,我们来看一下:

    char * url2="http://jxaummd.com:8080/test/getMqttInfo";
    esp_http_client_config_t config = {
        .url = "http://jxaummd.com:8080/test/getMqttInfo",
        .event_handler = _http_event_handler,
    };
    config.url=url2;

完美解决问题~

四、总结

这个问题折磨了我将近2个小时,最终还是解决掉了,回顾下原因基础薄弱是一,发生了内存泄漏不回去看一下原因也是很狗的,遇到错误就不断是实验这种精神固然是正确的,但是查查资料,看看原理不来的更加快速准确嘛~

### 回答1: 在C语言,对于const char*类型的指针转换为char*类型的指针,需要使用类型转换来完成。由于const char*指针指向的是一个常量字符串,即不能被修改的字符序列,因此不能直接转换为char*类型的指针,否则会导致类型不匹配的错误。但是,如果我们确定转换后的指针不会用于修改原始字符串时,可以使用类型强制转换进行转换。 例如: const char* str = "Hello World"; // 定义一个常量字符串 char* new_str = (char*)str; // 使用类型转换将const char*转换为char* 需要注意的是,对于类型强制转换需要谨慎使用,因为它可能会导致一些潜在的问题。在进行类型转换时,必须确保不会对原始字符串进行修改,否则可能会导致未定义的行为。另外,const修饰的变量本身是有原因的,它可以防止一些编程错误的发生,如果没有特殊需要,最好保持原始指针const char*类型,不进行转换。 ### 回答2: 在C语言,将`const char*`转换为`char*`是一种类型转换操作,但需要注意的是,这种转换会丢失原有的常量特性,因为`char*`指向的内存可以被修改。 首先,我们需要明确`const char*`和`char*`的含义。`const char*`是指向常量字符的指针,意味着通过该指针修改指向的字符是不被允许的。而`char*`是指向字符的指针,可以通过该指针修改指向的字符。 要将`const char*`转换为`char*`,可以使用类型转换操作符`(char*)`来实现。例如,假设有一个`const char*`类型的指针`const_str`指向一个字符串常量,可以通过以下方式进行转换: ```c const char* const_str = "Hello world"; char* str = (char*)const_str; ``` 通过上面的转换,`const_str`指向的字符串常量将被强制转换为`char*`指针`str`,即可通过`str`指针修改指向的字符串。 值得注意的是,进行这种类型转换意味着程序员需要自己负责确保转换后的`char*`指向的内存不被修改为常量。在进行这种转换时应谨慎,确保不会引起程序逻辑错误或错误的内存访问。 ### 回答3: 在C语言const char*和char*这两种类型之间的转换是一种非常常见的场景。从const char*转换为char*的过程实际上是将一个指向常量字符的指针转换为一个指向非常量字符的指针。 在进行这种转换时需要注意一些问题。由于const char*指针指向的是常量字符,即不可修改的字符,所以直接将其转换为char*是不合法的。这是因为转换后的char*指针可以用来修改字符的值,这可能导致程序运行出现未定义行为。 为了避免这种问题,可以采用强制类型转换的方式将const char*转换为char*。但是需要强调的是,这种转换只有在确保const char*指针指向的字符是实际上可以修改的情况下才是合法的。否则,转换后的char*指针可能会导致程序的运行错误。 总结起来,将const char*转换为char*是一种常见的操作,但要确保在进行转换之前,明确知道const char*指针指向的字符是否可以修改,以避免潜在的运行错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值