使用itoa()函数后printf()调用的奇怪行为

时间:2014-04-06 18:25:04

标签: c

我正在刷新我的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()的行为还是我做错了什么。 问候。

2 个答案:

答案 0 :(得分:1)

正如大家在注释中指出的那样,变量c表示的数组大小为1.由于C要求字符串具有NULL终止符,因此只能在{{1}中存储长度为0的字符串}}。但是,当你调用c时,它不知道你处理它的缓冲区只有1个字符长,所以它会很高兴在itoa之后继续将数字写入内存(这是可能是包含c)的内存。

要解决此问题,请声明str的大小足以处理您计划放入其中的字符串,并为NULL终止符加1。 32位c可容纳的最大值为10位数,因此您可以使用int

为了进一步解释上面的内存覆盖情况,我们考虑在堆栈上的连续区域中分配char c[11]c(因为它们是局部变量)。所以str可能占用内存地址1000(因为它是一个零字符串加上一个NULL终止符),而c将占用内存地址1001到1008(因为它有6个字符,加上NULL终止符) 。当你尝试写字符串&#34; 9&#34;在str中,数字9被放入存储器地址1000,并且NULL终止符被放入存储器地址1001.由于1001是c的第一个地址,str现在代表零 - length string(任何其他字符之前的NULL终止符)。这就是你得到空白的原因。

答案 1 :(得分:0)

c必须是一个足够长的缓冲区来保存你的号码。

char c[20] ;

而不是

char c[] = "";