&引用;分段故障(堆芯倾倒)“;使用malloc函数时出错
使用malloc函数时出现“分段故障(堆芯转储)”错误。我了解到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
#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;
}
sizeof(char)
gets
而是使用fgets
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;
}