0

我正在浏览一些关于 C 的基本教程,使用Code::Blocks.

任何人都可以用下面的代码帮助我,并给出一些解释吗?它构建但在运行时崩溃。

#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 代码行中,我猜是指针的使用?

4

1 回答 1

0

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

另一个注意事项:您使用lineandaster会导致内存泄漏。如果你想malloc用空格填充分配的内存,你应该使用memset,如果你想分配一个字符串文字,你根本不应该使用malloc。您实际上所做的是覆盖由malloc.

于 2013-04-14T18:06:38.723 回答