2014-12-13 5 views
2

У меня есть этот указатель на функцию указателя, которая принимает два аргумента и, верна, возвращает указатель на массив. Но каков правильный способ вернуть указатель на массив в этом случае? Вот мой код:Указатель на функцию указателя ---> как вернуть указатель

#include <stdio.h> 
#include <stdlib.h> 

int **multiTable (unsigned int xs, unsigned int ys) 
{ 
    unsigned int i, j; 

    int **table = malloc(ys * sizeof(*table)); 
      // should I put malloc(ys * xs * sizeof(*table))? 

    for(i = 0; i < ys; i++) 
    { 
     for(j = 0; j < xs; j++) 
     { 
      table[i][j] = (j+1) * (i+1); 
     } 

    } 

    return table; //what would be the proper way to return table? Is this ok? 

    free(**table); //by the way, do I need this? 
} 

int main() 
{ 
    int sum = 0; 
    sum = multiTable2(3,2); 

    return 0; 
} 

Какой бы правильный способ вернуть таблицу? Я написал таблицу возврата; нормально, или это должно быть как таблица возврата или таблицы возврата или возврата **? А также, нужно ли мне освобождать стол?

+1

вы выделяете 'table', но не выделяют' таблицу [х] ', что приводит к [* неопределенное поведение] (HTTP: // ан .wikipedia.org/wiki/Undefined_behavior), которые вы также имеете в этом 'free' вызове. –

+0

Тогда ваше назначение в функции 'main' также неверно. В общем, ваш компилятор должен кричать на вас! –

+0

И ваш бесплатный звонок действительно неправильный, очень. Содержит ли этот код? –

ответ

1

Я думаю, что это то, что вы пытаетесь сделать.

#include <stdio.h> 
#include <stdlib.h> 

int **multiTable(unsigned int xs, unsigned int ys) 
{ 

    unsigned int i, j; 
    int **table; 

    table = malloc(ys * sizeof(int *)); /* you need space for ys integer arrays */ 
    if (table == NULL) 
     return NULL; 
    for (i = 0 ; i < ys ; i++) 
    { 
     table[i] = malloc(xs * sizeof(int)); /* you need space for xs integers */ 
     if (table[i] != NULL) /* did malloc succeed? */ 
     { 
      for (j = 0 ; j < xs ; j++) 
       table[i][j] = (j + 1) * (i + 1); 
     } 
    } 
    return table; 
} 

int main() 
{ 
    int **sum; 

    sum = multiTable(3, 2); 
    /* do somenthing with sum here */ 
    if (sum != NULL) 
    { 
     /* now you must use free, like this */ 
     unsigned int i; 
     for (i = 0 ; i < 2 ; i++) 
     { 
      if (sum[i] != NULL) 
       free(sum[i]); 
     } 
     free(sum); 
    } 
    return 0; 
} 

Это можно сделать, но вам нужно больше узнать, чтобы понять основы.

Ваша проблема не

как вернуть указатель

, но вместо того, чтобы, как использовать malloc и free.

+0

Если бы я хотел использовать только один malloc, будет ли это работать: int (* table) [xs] = malloc (ys * sizeof (* table)) – BuffetBiffet

+0

Или int ** table = malloc (ys * xs * sizeof (* Таблица))? – BuffetBiffet

+0

Нет, это было бы что-то вроде 'int * table = malloc (xs * ys * sizeof (int))', но тогда вам нужно было бы вычислить индекс самостоятельно. –

0

Если я хотел бы использовать только один таНос, будет ли эта работа: ИНТ (* таблица) [хз] = таНос (YS * SizeOf (* таблица))

Да, это было бы , если вы настраиваете функцию в соответствии с комментарием Мэтта McNabb в:

#include <stdio.h> 
#include <stdlib.h> 

int (*multiTable(unsigned int xs, unsigned int ys))[] 
{ 
    unsigned int i, j; 
    int (*table)[xs] = malloc(ys * sizeof *table); 
    for (i = 0; i < ys; i++) 
    for (j = 0; j < xs; j++) 
     table[i][j] = (j+1) * (i+1); 
    return table; 
} 

int main() 
{ 
    const int xs = 3, ys = 2; 
    int (*sum)[xs]; 
    sum = multiTable(xs, ys); 
    int i, j; 
    for (i = 0; i < ys; i++, puts("")) 
    for (j = 0; j < xs; j++) 
     printf("%d", sum[i][j]); 
    return 0; 
} 
Смежные вопросы