函数返回我的C程序中的局部变量错误的地址

时间:2015-10-02 02:43:54

标签: c compiler-errors

我的编译器出现了标题中提到的错误。我不明白我做错了什么。有人可以向我解释一下。我和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);  
}

2 个答案:

答案 0 :(得分:2)

你有两个问题:

  1. 你不能返回函数本地变量的地址,因为它是在函数的堆栈帧中分配的,因此当函数返回时它会与函数本身一起释放。

  2. 您使用的是free()错误,只有当您使用free()时才应使用malloc(),即使您使用了算术但只使用了由malloc() / calloc() / realloc()之一返回的指针。并且只有当您不再需要使用数据时,或者当您不再取消引用指针时更好。

  3. 试试这个,我希望上面的解释+这段代码可以帮助你理解

    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此变量,因为调用者将使用它。