STRCAT代码构建,运行但崩溃

时间:2013-04-14 17:47:02

标签: pointers strcat

我正在使用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代码行中,我想使用指针?

1 个答案:

答案 0 :(得分:0)

问题是你的blank字段为一个字符提供了空间,但那里最多需要40个字符。使用strcatstrncat时,目标缓冲区(这是任一函数的第一个参数)必须为连接的字符串和终止\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));

另一个注意事项:使用lineaster会导致内存泄漏。如果要使用空格填充分配有malloc的内存,则应使用memset,如果要分配字符串文字,则根本不应使用malloc。你实际做的是覆盖malloc返回的指针。