修改C中函数内的2D malloc数组

时间:2014-04-18 21:21:53

标签: c arrays pointers malloc

getTable获取存储在其中的2d结构数组和副本int的内容 它到table。但是,当我尝试从table main中读取任何内容时,我在运行时遇到Segmentation fault错误。

void getTable(char*s1, char*s2, char**table)
{
/*
SKIP SOME STUFF
*/

    table = malloc(sizeof(char*)*(s2Len+1));
    for (i = 0 ; i <= s2Len; i++)
        table[i] = malloc(sizeof(char)*(s1Len+1));
    for (i = 0 ; i <= s2Len; i++)
        for (j = 0 ; j <= s1Len; j++)
            table[i][j] = '0' + tmpTable[i][j].num;

//prints what table points to correctly
    for (i = 0 ; i <= s2Len; i++)
    {
        printf("\n");
        for (j = 0 ; j <= s1Len; j++)
            printf("%2c", table[i][j]);
    }
    printf("\n");
}

int main(void)
{

    char ** table; // for number table

/*
SKIP SOME STUFF
*/

// gives error: Segmentation fault (core dumped)
    getTable(s1,s2,table);
    printf("getTable test\n");
    int i, j;
    //
    for (i = 0 ; i <= strlen(s2); i++)
    {
        printf("\n");
        for (j = 0 ; j <= strlen(s1); j++)
            printf("%c ", table[i][j]);
    }
   return 0;
}

2 个答案:

答案 0 :(得分:1)

您修改了子函数(getTable)中的局部变量(表),但是我没有看到您将其传递回调用者的位置。我认为调用者(主)仍在查看其原始值。

如果你将table的main值初始化为NULL,并且在调用函数后使用%p表示table的值的printf,我认为它仍将指向NULL。

答案 1 :(得分:0)

试试这个:

void getTable(char*s1, char*s2, char***pTable)
{
    char **table = *pTable;
     .... rest of code ...
}

并在主要:

int main(void)
{
    char ** table; // for number table
    getTable(s1,s2, &table);
    ... rest of code ...
}

在原始代码中,为table参数分配内存,但main中的本地表没有获取此值,因此您需要将此local的地址传递给您的函数。 另一种方法是让你的getTable函数返回一个**,你可以将它分配给main中的本地表:

char **getTable(char*s1, char*s2)
{
    char **table;
     .... rest of code ...
    return table;
}

int main(void)
{
   char **table;

   table = getTable(s1,s2);
   ... rest of code ...
}