我正在使用Code::Blocks
运行一些关于C的基本教程。
任何人都可以帮我解决以下代码,并提供一些解释吗?它会在运行时生成但崩溃。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX_LEN 40
main()
{
int pos;
char *line,*aster,*blank;
line=(char *)malloc(MAX_LEN);
aster=(char *)malloc(1);
blank=(char *)malloc(1);
line=" ";
aster="*";
blank="";
printf("Enter position of star (1-40): ");
scanf("%d",&pos);
if(pos>0&&pos<41)
{
printf("\n");
printf(" 1 2 3 4\n");
printf("1234567890123456789012345678901234567890\n");
puts(strcat(strncat(blank,line,pos-1),aster));
}
else
printf("Out of range");
}
问题似乎在strcat代码行中,我想使用指针?
答案 0 :(得分:0)
问题是你的blank
字段为一个字符提供了空间,但那里最多需要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
。你实际做的是覆盖malloc
返回的指针。