c - 为什么在重新分配空间后将 char 分配给指向指针 char 的指针时会出现段错误?
问题描述
所以我有一个双字符点猜测,我已经为它分配了 malloc 空间,并且当我为获得正确分配的内存量时,我为额外的字符重新分配了空间。我遇到的问题是,只要它命中就会出现段错误*guess[i] = input
,我无法弄清楚为什么如果我从 stdin 传递它 \n 它可以工作并通过 for 循环,但是只要 stdin 中有多个字符,它就会出现段错误
这是它之前的 for 循环和 malloc
char input;
guess = (char**) malloc(1*sizeof(char));
for(int i = 0; input != '\n'; i++)
{
input = getc(stdin);
lengthG += 1;
*guess =(char *) realloc(*guess, lengthG * sizeof(char));
*guess[i] = input;
}
这是整个功能
int fund_check_input(char *val, char **guess)
{
size_t lengthV = 0;
size_t lengthG = 0;
for(int i = 0; val[i] != '\0'; i++)
{
if(lengthV < 4)
{
if(val[i] < 48 || val[i] > 57)
return -1;
else
lengthV += 1;
}
else
return -1;
}
char input;
guess = (char**) malloc(1*sizeof(char));
for(int i = 0; input != '\n'; i++)
{
input = getc(stdin);
lengthG += 1;
*guess =(char *) realloc(*guess, lengthG * sizeof(char));
*guess[i] = input;
}
printf("%s\n", "hey");
if(lengthG != lengthV)
return 0;
else
{
for(int i = 0; *guess[i] != '\0'; i++)
{
if(val[i] != *guess[i])
return 0;
}
}
return 1;
}
我认为我分配了足够的内存,因为当我增加重新分配的数量时,它仍然会出现段错误,所以我不完全确定发生了什么。
解决方案
这里
guess = (char**) malloc(1*sizeof(char));
^^^^^
您只为 1 个字符分配内存。
但是,您似乎想要一个指向字符的空间。
您是否打算这样做:
guess = (char**) malloc(1*sizeof(char*));
^
另请注意
在 C 中不需要类型转换。
这
guess = malloc(1*sizeof *guess);
通常是一种更好的形式,因为您避免了上面所做的拼写错误。(1*
也可以删除)
也就是说,考虑*guess
修复上述错误后的值是多少。您需要在调用之前确保它已正确初始化realloc
推荐阅读
- vue.js - 多个 Vue 应用程序,多个入口文件,相同的 Vuex/Vue3CompostitionApi 存储 [失去反应性]
- sql - 在 JOINS 和 WHERE 子句遇到问题的 SQL 语句方面需要帮助
- amazon-web-services - Redash 容器在 Fargate 的“worker”上损坏
- javascript - vue.js 反应性和数据与 mixin
- task - Chainlink Hackathon 21 HardHat教程在智能合约中执行函数
- android - RecyclerView billingClient:没有附加适配器;跳过布局,有时有效,有时无效
- c - 当我有足够的空间并且数组中没有太多数据时,为什么我在 C 中出现运行时 #2 失败
- python - “snakemake:错误:无法识别的参数:”
- python - 将 Pandas 数据框列表导出到 Excel
- responsive-images - 响应式图像和对象