繁体   English   中英

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

[英]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]

为了进一步说明上面的内存覆盖情况,我们考虑将cstr分配在堆栈上的连续区域中(因为它们是局部变量)。 因此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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM