为什么在 realloc space 之后将 char 分配给指向 char 指针的指针时会出现段错误?
Why am I getting a segfault when assign a char to a pointer to pointer char after realloc space for it?
所以我有一个双字符点猜测,我已经为其分配了 malloc space 并且在输入时我为额外字符重新分配以获得分配的正确内存量。我遇到的问题是,每当它命中 *guess[i] = input
时它就会出现段错误,我无法弄清楚为什么如果我从标准输入传递它 \n 它可以工作并通过 for 循环,但是只要来自标准输入的字符超过一个段错误
这是 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] != '[=12=]'; 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] != '[=12=]'; 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
之前,您需要确保它已正确初始化
所以我有一个双字符点猜测,我已经为其分配了 malloc space 并且在输入时我为额外字符重新分配以获得分配的正确内存量。我遇到的问题是,每当它命中 *guess[i] = input
时它就会出现段错误,我无法弄清楚为什么如果我从标准输入传递它 \n 它可以工作并通过 for 循环,但是只要来自标准输入的字符超过一个段错误
这是 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] != '[=12=]'; 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] != '[=12=]'; 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