大家好,我是小跳,我来为大家解答以上问题。c语言itoa函数,itoa函数很多人还不知道,现在让我们一起来看看吧!
1、楼上的错的一塌糊涂的~~~~~
2、首先我们来分析你这个代码要做什么事情,就是把数字123转换成字符串123
3、那么,你的程序当中只有一个字符型的指针变量,所以我们需要用molloc函数在内存中找到连续的一段空间,用来存放我们的数据,然后把这段空间的首地址转换成char *赋值给str,这样,str就相当于字符型数组的头指针了。
4、问题分析完了,那么错误在哪里呢?
5、就是str = (char*)malloc(sizeof(char));这里
6、存放字符串123,最少需要四个字节的地方,而一个char型变量占1字节,molloc里面的参数最小应该为4*sizeof(char)
7、然后我们再说,你这个程序为什么是运行时错误,而不是编译时错误
8、因为从语法上面来讲,你这个程序没有任何错误,所以编译器是不会检查出错误的。运行时错误,就是因为你开辟的空间太小了,其实这种错误有时也不能被发现,为什么呢?我们下面来说明
9、你在内存池中动态的申请了1个字节的空间,用来存放数据,那么比如说,系统给你分配的空间地址为123H,而恰巧在125H处的内存被另外一个程序占用着,并且被设置为其他程序不可写。那么在itoa()函数运行时,1赋值到了123H处,2到了124H处,那么当要将3赋值到125H处时,程序就会报错~~错误是什么呢?肯定是 “****内存为只读,不可写”类似这样的话,所以就出现了运行时错误。
10、那为什么有的时候这种错误被我们发现不了呢?那是因为如果此时125H以及126H都没有被其他程序所占用,那么系统还是允许你的程序对其进行赋值的,即使这块内存不是归你的程序所特有。
11、在上面的情况下,就不会发生运行时错误。
12、所以这种错误不是你的程序每次运行都会报的~~~这也就是说明与你的str=NULL这句话根本没有关系,因为你的程序运行了两次,前后是没有关系的,前后系统内存的占用情况也不一样,所以导致分配到的地址可能也不同,就出现了一回报错,一回不报的情况。
13、综上所述,你的错误原因还是因为在动态申请内存空间的时候,地方申请小了,改法:
14、str = (char*)malloc(4*sizeof(char));这个是最小的要求。
15、所以说楼上错的简直是惨不忍睹呀~~~
本文到此讲解完毕了,希望对大家有帮助。