我的编译器出现了标题中提到的错误。我不明白我做错了什么。有人可以向我解释一下。我和C一起工作已经有一段时间了。
char** answer(char c)
{
// Initial scanf and check
printf("Please input the character which you want to build your diamond with");
if (check(c) == true) {
printf("\n");
} else {
printf("Not a valid character");
return NULL;
}
//--------------------------------------------------------------------------------------------------------
//Preprocessing
//--------------------------------------------------------------------------------------------------------
//processing declarations
//Number of Rows
int pre_r = (int)c - 65;
int r = ( pre_r * 2 ) + 1;
//Declare the column of pointers
char *diamond[r];
//Declare the rwo of characters
// 2D array declared here to save on computation in situations where characters are not valid
for (int i=0; i<r; i++)
diamond[i] = (char*)malloc(c * sizeof(char));
//--------------------------------------------------------------------------------------------------------
//Postprocessing
//--------------------------------------------------------------------------------------------------------
return diamond;
free(diamond);
}
答案 0 :(得分:2)
你有两个问题:
你不能返回函数本地变量的地址,因为它是在函数的堆栈帧中分配的,因此当函数返回时它会与函数本身一起释放。
您使用的是free()
错误,只有当您使用free()
时才应使用malloc()
,即使您使用了算术但只使用了由malloc()
/ calloc()
/ realloc()
之一返回的指针。并且只有当您不再需要使用数据时,或者当您不再取消引用指针时更好。
试试这个,我希望上面的解释+这段代码可以帮助你理解
char **
answer(char columns)
{
int rows;
char **diamond;
printf("Please input the character which you want to build your diamond with");
if (check(columns) == true) {
printf("\n");
} else {
printf("Not a valid character");
return NULL;
}
rows = 2 * (columns - 'A') + 1;
diamond = malloc(rows * sizeof(*diamond));
if (diamond == NULL)
return NULL;
/* You must check for `NULL' for every `malloc()' */
for (int i = 0 ; i < rows ; i++)
diamond[i] = malloc(columns + 1); /* <- check for `NULL' */
/* ^
* if this is for a string you need space for the `nul' terminator
*/
return diamond;
}
另外,请使用有意义的变量名称,并且不要忘记在此代码中为每个free()
致电malloc()
,这留给您。我相信你可以弄清楚如何。
答案 1 :(得分:1)
diamond
是一个本地数组,您正在尝试返回该数组。您应该将其声明为char **
和malloc空间以获取足够的char指针:
char **diamond = malloc(r * sizeof(char *));
您不希望free
此变量,因为调用者将使用它。