函数中char c[]="hello"与char * c = "hello"区别 -- C

char c[]="hello"

是局部数据。

c[0] = ‘t‘; // ok

char * c = "hello"

全局数据,在静态存储区域。

*c = ‘t‘; // false

#include <stdio.h>

/*	例子一 */
const char * strA()
{
	/*	正确 通过static开辟一段静态存储空间	*/
	static char str[] = "hello";

	/*	错误 分配一个局部数据,函数结束内存的栈释放
		返回后的结果是不确定的且不安全,随时都有被回收的可能*/
	char str[] = "hello";

	/*	正确 分配一个全局数组,内存的全局区域*/
	char * str = "hello";

	return str;
}

/*	例子二 */
int
main()
{
	static char str1[] = "hello";
	char str2[] = "hello";
	char * str3 = "hello";
	char * str4 = "hello";

	printf("str1 = 0x%x\n", str1);
	printf("str2 = 0x%x\n", str2);
	printf("str3 = 0x%x\n", str3);
	printf("str4 = 0x%x\n", str3);
	/*
	现象总结:
	1、str1、str3、str4的地址始终不变。
	2、str3、str4地址相同。
	3、str2的地址在一直变量。

	解释原因:
	1、str1、str3、str4地址是在静态存储空间。
	2、str3、str4在静态存储空间同字符串。
	3、str2是在栈空间。
	*/
}
/*
连续运行了5次

[[email protected] test_class]# ./a.out
str1 = 0x8049734
str2 = 0xbf921e42
str3 = 0x8048530
str4 = 0x8048530
[[email protected] test_class]# ./a.out
str1 = 0x8049734
str2 = 0xbfd174a2
str3 = 0x8048530
str4 = 0x8048530
[[email protected] test_class]# ./a.out
str1 = 0x8049734
str2 = 0xbfa84cd2
str3 = 0x8048530
str4 = 0x8048530
[[email protected] test_class]# ./a.out
str1 = 0x8049734
str2 = 0xbffd3472
str3 = 0x8048530
str4 = 0x8048530
[[email protected] test_class]# ./a.out
str1 = 0x8049734
str2 = 0xbf954982
str3 = 0x8048530
str4 = 0x8048530
*/

函数中char c[]="hello"与char * c = "hello"区别 -- C

时间: 2024-08-27 19:35:12

函数中char c[]="hello"与char * c = "hello"区别 -- C的相关文章

45、导航钩子函数中使用next()和next(&#39;\指定路径&#39;)的区别:

当在router.beforeEach((to, from, next) 钩子函数中使用: 1.使用next()时,直接跳转到下一页,没有再执行导航钩子函数 2.使用next('指定路径')跳转到指定页面还会执行钩子函数所以会死循环. 所以在钩子函数中使用next('指定路径')时候: 一般会加判断:当不符合条件时使用next('指定路径'),直到符合条件再设置next(). 45.导航钩子函数中使用next()和next('\指定路径')的区别: 原文地址:https://www.cnblog

类成员函数中重载/重写(覆盖)/重定义(隐藏)的区别

https://blog.csdn.net/ranxiaoxu123/article/details/52291385 https://www.cnblogs.com/renyuan/archive/2013/06/08/3127562.html 原文地址:https://www.cnblogs.com/Kiven5197/p/8934207.html

jQuery插件开发及jQuery.extend函数详解和jQuery.fn与jQuery.prototype区别

一.jQuery插件开发分为两种:  1.类级别: 类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法. 开发扩展其方法时使用$.extend方法,即jQuery.extend(object); $.extend({ add:function(a,b){return a+b;} , minus:function(a,b){return a-b;} }); var i = $.add(3,2); var j = $.minus(3,2); 2.对象级别: 对

Arduino中数据类型转换 int转换为char 亲测好使,itoa()函数

由于博主最近在做一个项目,需要采集不同传感器的数据,包括float型的HCHO,以及int型的PM2.5数据.但是最终向服务器上传的数据都得转换为char型才能发送,这是借鉴了一个github上面的实例实现了在Arduino上部署socket使之与服务器进行交互. github实例如下: https://github.com/washo4evr/Socket.io-v1.x-Library 在本项目中多次使用了数据类型转换,前文提到了float和double类型转换为char,如下:http:/

C语言中的可变参数函数 三个点“…”printf( const char* format, ...)

第一篇 C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的(用三个点“…”做参数占位符),实际调用时可以有以下的形式: printf("%d",i); printf("%s",s); printf("the number is %d ,string is:%s",

【转载】Qt中的QString,QByteArray,Qchar, char*

先要说的是QString. 之所以把QString单独拿出来,是因为string是很常用的一个数据结构,甚至在很多语言中,比如JavaScript,都是把string作为一种同int等一样的基本数据结构来实现的. 每一个GUI程序都需要string,这些string可以用在界面上的提示语,也可以用作一般的数据结构.C++语言提供了两种字符串的实现:C风格的 字符串,以'\0‘结尾:std::string,即标准模版库中的类.Qt则提供了自己的字符串实现:QString.QString以16位 U

在函数体内声明[1] char *str=”abc”;和[2] char str[]={‘a’,’b’,’c’}有什么区别?

在函数体内声明[1] char *str="abc";和[2] char str[]={'a','b','c'}有什么区别 1.   [1][2]中str变量都分配在栈上:备注:([1]是字符指针,准确的说类似于字符串数组的功能 ,等价于 char str[]="abc", [2]是字符数组) sizeof()和strlen()计算的时候不一样 2.    [1]中str指向常量存储区的字符串"abc",其中字符串末尾会补0 3.    [2]中

【编程拾遗】VC++中LPCTSTR、CString、char *、string之间的相互转换

字符集 在VC2012中,字符集默认采用Unicode字符集(Use Unicode Charecter Set选项),其值还可以设置为多字节字符集(Use Multi-Byte Charecter Set). 为什么要使用Unicode 可以很容易地在不同语言之间进行数据交换. 使你能够分配支持所有语言的单个二进制.exe文件或DLL文件. 提高应用程序的运行效率. Windows 2000是使用Unicode从头进行开发的,如果调用任何一个Windows函数并给它传递一个ANSI字符串,那么

c++中new char(10) 和 new char[10]的区别

今天随手写个程序,在网上随意找个代码照着写,无意中使用了 char *p = new char(10); 来创建char数组,而且在netbeans上编译运行都没有问题,结果在oj上一直报runtime error,放在同学计算机上用codeblock运行也报错. 后来发现是这个分配的问题: char *p = new char[65]; // 分配一个大小为65的char数组 char *p = new char(65); //分配一个char ,并用65来初始化值 后来程序中改成new ch