&引用;分段故障(堆芯倾倒)“;使用malloc函数时出错

&引用;分段故障(堆芯倾倒)“;使用malloc函数时出错,c,malloc,C,Malloc,使用malloc函数时出现“分段故障(堆芯转储)”错误。我了解到malloc的初始化值充满了垃圾内存。该部分是否出现分段错误 #include <stdio.h> #include <stdlib.h> int chnum; char *getstr(void) { char *str1 = (char *)malloc(sizeof(char) * chnum); printf("Write a string: "); g

使用malloc函数时出现“分段故障(堆芯转储)”错误。我了解到malloc的初始化值充满了垃圾内存。该部分是否出现分段错误

#include <stdio.h>
#include <stdlib.h>

int chnum;

char *getstr(void)
{
    char *str1 = (char *)malloc(sizeof(char) * chnum);
    printf("Write a string: ");
    gets(str1);
    return str1;
}

int main(void)
{
    printf("What is the maximum length of a string? ");
    scanf("%d",chnum);
    char *set = getstr();
    printf("string : %s \n",set);
    free(set);
    return 0;
}
#包括
#包括
内质网;
char*getstr(无效)
{
char*str1=(char*)malloc(sizeof(char)*chnum);
printf(“写入字符串:”);
获取(str1);
返回str1;
}
内部主(空)
{
printf(“字符串的最大长度是多少?”);
scanf(“%d”,chnum);
char*set=getstr();
printf(“字符串:%s\n”,已设置);
自由(设定);
返回0;
}
  • malloc的铸造结果被认为是一种不良做法
  • 不要使用全局变量在函数之间传递数据。为它使用函数参数
  • 您不必像定义1那样
    sizeof(char)
  • 始终检查malloc的结果
  • 不要使用
    gets
    而是使用
    fgets
  • 始终检查scanf的结果
  • scanf
    中,将指针传递给对象,而不是对象本身
  • 检查可能失败的函数的结果(
    getstr
  • #包括
    #包括
    char*getstr(大小)
    {
    char*str1=malloc(chnum);
    如果(str1)
    {
    printf(“写入字符串:”);
    fgets(str1,chnum,stdin);
    printf(“\n”);
    }
    返回str1;
    }
    内部主(空)
    {
    中脑大小;
    printf(“字符串的最大长度是多少?”);
    如果(scanf(“%zu”,&chnum)==1)
    {
    printf(“\n”);
    fgetc(stdin);
    char*str=getstr(chnum);
    如果(str)
    {
    printf(“字符串:%s\n”,str);
    自由基(str);
    }
    }
    返回0;
    }
    
    您不应该先解决“垃圾内存”问题吗?
    scanf(“%d”,chnum)->
    scanf(“%d”&chnum)(打开编译器警告!)。
    获取(str1)可能导致缓冲区溢出。永远不要使用
    获取
    ,它不再是标准C库的一部分。请阅读缓冲区大小也被关闭了1(对于空终止符)。
    getstr
    函数的更好设计是将字符串长度作为参数,而不是依赖于全局变量。为什么在回答中声明chnum in size\u t type并以%zu type打印它?我试图将其声明为int类型并将其打印为%d,但它不起作用。
    #include <stdio.h>
    #include <stdlib.h>
    
    char *getstr(size_t chnum)
    {
        char *str1 = malloc(chnum);
        if(str1)
        {
            printf("Write a string: ");
            fgets(str1, chnum, stdin);
            printf("\n");
        }
        return str1;
    }
    
    int main(void)
    {
        size_t chnum;
        printf("What is the maximum length of a string? ");
        if(scanf("%zu", &chnum) == 1)
        {
            printf("\n");
            fgetc(stdin);
            char *str = getstr(chnum);
            if(str) 
            {
                printf("string : %s \n",str);
                free(str);
            }
        }
        return 0;
    }