C sprintf函数崩溃了我的程序

时间:2014-08-25 23:46:07

标签: c

我正在看一个在线学习C的课程,我偶然发现了一些让我的程序崩溃的事情。 在视频中,它们显示以下代码段:

#include <stdio.h>

int main()
{
    char* ch;
    int num = 12345;
    sprintf(ch, "%d", num);
    printf("%s\n", ch);
    return(0);
}

我决定制作自己的小程序并进行测试。 这是我写的代码:

#include <stdio.h>

#define A 65

int main()
{
    int n = A;
    printf("n is equal to %d\n", n);
    n = atoi("10");
    printf("n is equal to %d\n", n);
    char* ch;
    sprintf(ch, "%d", n);
    printf("ch is equal to %s\n", ch);
    return 0;
}

当我运行程序时,输出如下:

n is equal to 65
n is equal to 10

在这部分之后我的程序崩溃了。 我假设sprintf函数导致这个,但我不知道为什么,我是语言的新手,所以我不知道,我认为我已经完成了所有事情,正好通过视频中显示的代码片段来判断。 有人可以解释一下我做错了吗?

提前致谢。

3 个答案:

答案 0 :(得分:4)

  

在视频中,他们会显示以下代码段:[...]

如果这是他们认为应该有效的片段,请停止观看该视频:该片段具有未定义的行为,除非出现不幸的巧合,否则它无法正常工作。

  

我决定制作自己的小程序并进行测试。

您的程序具有完全相同的问题:sprintf正在写入的缓冲区尚未初始化。更改ch的声明以为其分配一些空间,如下所示:

char ch[20];

这将阻止您的代码写入未初始化指针所指向的内存,从而修复未定义的行为。

  

你能解释一下如何使用char *吗?

如果您想使用char*,请为其指定适当大小的malloc结果,并在结尾处free结果:

char *ch = malloc(20);
... // Put the rest of the code here
// Add this line before the end:
free(ch);

答案 1 :(得分:2)

您需要为ch分配内存,否则使用数组而不是指针。

char* ch = malloc(sizeyouwant * sizeof(char));

您想要的尺寸是您要存储的字符数。

答案 2 :(得分:0)

问题在于:

char* ch;

这只是一个char指针,它需要指向分配的内存来保存字符串:

char ch[32];