[英]Weird behavior of printf() calls after usage of itoa() function
我正在提高自己的C技能。我尝试了以下代码来学习itoa()
函数的用法:
#include<stdio.h>
#include<stdlib.h>
void main(){
int x = 9;
char str[] = "ankush";
char c[] = "";
printf("%s printed on line %d\n",str,__LINE__);
itoa(x,c,10);
printf(c);
printf("\n %s \n",str); //this statement is printing nothing
printf("the current line is %d",__LINE__);
}
我得到以下输出:
ankush printed on line 10
9
//here nothing is printed
the current line is 14
问题是,如果我评论语句itoa(x,c,10);
从代码中,我得到上述声明,并得到以下输出:
ankush printed on 10 line
ankush //so i got it printed
the current line is 14
这是itoa()
的行为还是我做错了什么。 问候。
正如人们在评论中指出的那样,变量c
表示的数组的大小为1。由于C要求字符串具有NULL终止符,因此只能在c
存储长度为0的字符串。 但是,当您调用itoa
,并不知道您要传递的缓冲区只有1个字符长,因此它将很乐意继续将数字写到c
之后的内存中(很可能是包含str
内存)。
要解决此问题,请声明c
的大小足以处理您计划放入的字符串,并为NULL终止符加1。 一个32位int
可以容纳的最大值是10位数字,因此可以使用char c[11]
。
为了进一步说明上面的内存覆盖情况,我们考虑将c
和str
分配在堆栈上的连续区域中(因为它们是局部变量)。 因此c
可能会占用内存地址1000(因为它是一个零字符串加上NULL终止符),而str
会占用内存地址1001至1008(因为它有6个字符加上NULL终止符)。 当您尝试将字符串“ 9”写入c
,将数字9放入内存地址1000中,并将NULL终止符放入内存地址1001中。由于1001是str
的第一个地址,因此str
现在表示一个零长度的字符串(任何其他字符之前的NULL终止符)。 这就是为什么您变得空白。
c必须是足以容纳您的电话号码的缓冲区。
写
char c[20] ;
代替
char c[] = "";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.