首页 > 解决方案 > 为什么在重新分配空间后将 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;
}

我认为我分配了足够的内存,因为当我增加重新分配的数量时,它仍然会出现段错误,所以我不完全确定发生了什么。

标签: cpointerschardynamic-memory-allocation

解决方案


这里

guess = (char**) malloc(1*sizeof(char));
                                 ^^^^^

您只为 1 个字符分配内存。

但是,您似乎想要一个指向字符的空间。

您是否打算这样做:

guess = (char**) malloc(1*sizeof(char*));
                                     ^

另请注意

  1. 在 C 中不需要类型转换。

  2. guess = malloc(1*sizeof *guess);通常是一种更好的形式,因为您避免了上面所做的拼写错误。(1*也可以删除)

也就是说,考虑*guess修复上述错误后的值是多少。您需要在调用之前确保它已正确初始化realloc


推荐阅读