【问题标题】:STRCAT Code builds, runs but crashes outSTRCAT 代码构建、运行但崩溃
【发布时间】:2013-04-14 17:47:02
【问题描述】:

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

【问题讨论】:

    标签: pointers strcat


    【解决方案1】:

    问题是您的 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返回的指针。

    【讨论】:

    • 谢谢,我在阅读 strcat 和 strncat 时发现了这个缺陷,我曾尝试调整“空白”的长度。我会尽力落实你的建议。为什么你的'blank = malloc ...'没有(char *)?空白[0]=0 是否在空白的第一个内存地址中存储“0”?这与空白 = ""; 相矛盾?希望我的问题有意义。
    • 我没有包含类型转换,因为它不需要在 C 中将 void 指针转换为 char 指针。但无论如何包含它并没有错误。
    • 是的,blank[0]=0 将第一个字符设置为 0。你不能在那里使用blank="",因为那会覆盖你从malloc获得的指针。
    • 太棒了,它奏效了。谢谢!最后的问题/信息,空白中的“0”被 strcat 的输出覆盖。这是正确的解释吗?
    • 是的,strcatstrncat 覆盖终止 0 字符并在连接字符串的末尾设置一个。
    猜你喜欢
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 2019-04-24
    相关资源
    最近更新 更多