char *s1 = “hello“与char s2[ ] = “hello“的本质(stm32F103C8t6单片机测试版)

测试代码:

#include "stm32f10x.h"                  // Device header
#include "Serial.h"

char *s1;
char s2[6];

char * fun(){
	s1 = "hello";
    char s2[] = "hello";
	printf("Address of s1 (pointer): %p\n", (void*)s1); // 打印s1指向的地址
	printf("Address of s1: %p\n", (void*)&s1); // 打印s1本身的地址
	printf("Address of s2 (array): %p\n", (void*)s2);   // 打印s2数组的地址
	printf("*s1=%X\n",*s1);  // 打印s1指向的内容
	return s1;
}

int main(){
	
	Serial_Init();

	printf("Address of s1 (pointer): %p\n", (void*)s1);// 打印s1指向的地址
	printf("Address of s1: %p\n", (void*)&s1); // 打印s1本身的地址
	printf("Address of s2 (array): %p\n", (void*)s2);   // 打印s2数组的地址
	
	char * h = fun();
	
	printf("Address of s1 (pointer): %p\n", (void*)s1);// 打印s1指向的地址
	printf("Address of s1: %p\n", (void*)&s1); // 打印s1本身的地址
	printf("Address of s2 (array): %p\n", (void*)s2); // 打印s2数组的地址
	printf("*s1=%X\n",*s1);  // 打印s1指向的内容

    while (1) {
        // 保持单片机运行
    }
	
}

输出结果:

测试结果截图

理解:

1)如果指针指向一个字符串字面量(例如 char *s1 = “hello”;),则该指针在程序的整个生命周期内都有效,都指向这个字符串。
2)如果指针指向函数内部定义的局部数组(例如 char s2[] = “hello”;),则这种指针的有效性仅限于该函数的作用域。(自己理解,不一定对:"hello"被复制到栈上,s2指向数组首地址)
总结:指针s1指向的量是恒定不变(保存在flash的Rodata区),所以一直有效;s2[ ]是保存在栈上的,函数结束就释放了内存,s2这个头指针也就无效了。换句话,指针的有效性取决于指针所指向的内存区域及其生命周期。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值