我正在看一个在线学习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函数导致这个,但我不知道为什么,我是语言的新手,所以我不知道,我认为我已经完成了所有事情,正好通过视频中显示的代码片段来判断。 有人可以解释一下我做错了吗?
提前致谢。
答案 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];