Pointers STRCAT代码生成、运行但崩溃

Pointers STRCAT代码生成、运行但崩溃,pointers,strcat,Pointers,Strcat,我正在使用code::Blocks运行一些关于C的基本教程 有人能帮我解释一下下面的代码吗?它可以构建,但运行时会崩溃 #包括 #包括 #包括 #定义最大长度40 main() { int pos; 字符*行,*aster,*空白; 行=(char*)malloc(MAX_LEN); aster=(char*)malloc(1); 空白=(字符*)malloc(1); 第“”行; aster=“*”; 空白=”; printf(“输入星号(1-40)的位置):”; scanf(“%d”和“&po

我正在使用
code::Blocks
运行一些关于C的基本教程

有人能帮我解释一下下面的代码吗?它可以构建,但运行时会崩溃

#包括
#包括
#包括
#定义最大长度40
main()
{
int pos;
字符*行,*aster,*空白;
行=(char*)malloc(MAX_LEN);
aster=(char*)malloc(1);
空白=(字符*)malloc(1);
第“”行;
aster=“*”;
空白=”;
printf(“输入星号(1-40)的位置):”;
scanf(“%d”和“&pos”);

如果(pos>0&&pos,则问题在于
空白
字段为一个字符提供空间,但最多需要40个字符。使用
strcat
strncat
时,目标缓冲区(这是两个函数的第一个参数)必须为连接的字符串和终止的
\0
字符提供足够的空间

你想做的是

line = "                                        ";
blank = malloc(MAX_LEN+1); /* 40 characters + terminating '\0' */
blank[0] = 0; /* Needed for strcat to work */
[...]
puts(strcat(strncat(blank, line, pos-1), aster));

另一个注意事项:使用
line
aster
会导致内存泄漏。如果要用空格填充分配给
malloc
的内存,则应使用
memset
,如果要分配字符串文字,则根本不应使用
malloc
。实际操作是覆盖指针returNED由代码> MaloC/<代码> ./P>谢谢,我尝试调整空白的长度,因为我在读STRCAT和STRCAT时发现了这个缺陷。我将尝试实现您的建议。为什么您的“空白=Maloc……”没有(char *)?空白(0)=0在第一个内存地址中存储一个“0”为空白吗?这与空白=“”相矛盾。希望我的问题有意义。我没有包括类型转换,因为在C中不需要将
void
指针转换为
char
指针。但无论如何,将其包括在内都不会出错。是的,
blank[0]=0
将第一个字符设置为
0
。您不能使用
blank=“”
因为这将覆盖从
malloc
获得的指针。非常好,它工作了。谢谢!最后一个问题/信息,空中的“0”被strcat的输出覆盖了。这是正确的解释吗?是的,
strcat
strncat
覆盖终止的
0
字符并设置为o在连接字符串的末尾添加ne。