char * itoa(int, char *, int); 第二个参数明明是char*,为什么却又不能是“char*”?

itoa函数在转换整型为字符串时,需要目标参数是一个可写内存的字符串。char * 和 char [] 的主要区别在于内存分配:char * 指向常量区,无法写入;而char [] 在栈上分配内存,可存储数据。itoa函数要求的目标字符串需要是可写的,因此必须确保为char *分配内存,例如通过malloc。直接使用常量字符串或未分配内存的char *会导致编译错误或运行时崩溃。字符串比较应使用strcmp,而不是直接用'==',因为它们比较的是指针地址而非内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

Itoa这个函数大家应该多多少少接触过,它的功能使把一个整型按照你给的进制转换成你想要的字符串,也就是这个函数让我觉得有必要再去研究一下字符串数组和字符串指针的区别。


首先看itoa这个函数原型,char * itoa(int originNum, char * targetStr, int standard);

第一个参数你的整型数据,第二个是一个字符串,第三个是一个int型表示N进制。

现在我们测试一下,

char *str=“hello”;

int num=123;

_itoa_s(num, str,10); //vs C++下使用会提示编译错误

itoa(num,str,10);//codeblocks下运行会崩溃,正常环境下都会崩溃的

 

char str2[]=“hello”;

itoa(num, str2,10);//运行正常

 

这样我们发现明明函数原型的参数就是char*,为什么我们写的str却不行呢?

char *和char[]到底有什么区别?

这里,我们先从其本质说起。说到底一个是数组一个是指针,两者其实除了都能保存字符串外区别确实大了。最重要的一点区别就是内存分配(关于C语言变量在内存的存储位置,大家可以参考…….),对于基本类型的单个变量与数组我们都会为其在栈上申请空间来存放数据,而指针只是指向一块内存的索引,所以char*声明的只是指向常量区”hello”的指针。


这时候我们再看一下itoa的功能,它是要把num转换成字符串存在str里面,然而这时候我们的str根本没有一块可以用的内存,当然会崩溃。

反观数组str2,在声明的时候就已经在栈上分配内存了,这时候当然可以保存数据了。

因此,必须要为其分配内存

char *t;

t = (char*)malloc(9*sizeof(char));


接着上面的例子,我们需要理解

char *str=“hello”;

char str2[]=“hello”;

这是两种不同的操作,str是声明一个指针指向常量区的”hello”。而str2是声明一个str2数组用来存放一个”hello”字符串的拷贝。总之,如果str动态申请内存的话,那么在堆里str指向的位置就会有一个”hello”,栈里面有str2指向的”hello”,常量区还有一个”hello”。虽然都是赋值,差距却非常大。


下面一个例子进一步证明了这一点(vs2012):


const char*s1= "sa1";

const char*s2= "sa1";

if(s1== "sa1")

{

         cout<<"ok";//打印ok

}

 

char *oname= (char*)malloc(6*sizeof(char));         

strcpy_s(oname,6,"hello");

cout<<oname;//打印hello

if(oname== "hello")

{

         cout<<oname;//不执行

}

 

char str2[]= "hello";

cout<<str2;//打印hello

if(str2== "hello")

{

         cout<<str2;//不执行

}


我们知道字符串比较不能用 == 直接比较,需要用strcmp,因为上面的s1s2onamestr2都是指针,比较其实只是比较指针的大小。我们看到,只有上面的 s1 == "sa1"结果是true。因为s1s2指向的都是常量区的“sa1”字符串。onamestr2分别指向堆和栈区。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值