копирование матриц в c - PullRequest
2 голосов
/ 05 ноября 2011

Итак, я получил это: char table1 [10 ^ length] [length];char table2 [10 ^ length] [length];

И компилятор не позволяет мне указать это: table1 = table2;

мой код должен принимать строку с дикими символами (только?)

и дать все возможные строки в выводе (ну, это часть большого проекта, но, допустим, распечатать их в терминале - если я сделаю это, я смогу обработать все остальное)

Вот полный код:

int ** wildReplacement(char *wildAM,int length)
{
    length=7;
    char * temp;
    strcpy(wildAM,"123?23");
    //getchar();
    int i=0;
    int j=0;
    int k=0;
    int l=0;
    int limit=0;
    int wildCharsNum;
    char *nlptr= NULL;

    char table1[10^length][length];
    char table2[10^length][length];


    wildCharsNum=charOccurenciesInStr(wildAM,'?');
    strcpy(temp,wildAM);
    strcpy(table1[0],wildAM);

    printf("\n!!WildChars In wildAM:%d",wildCharsNum);


    while(k<wildCharsNum)
    {
        l=0;
        while(l<=limit)
        {
            strcpy(temp,table1[l]);
            i=0;
            nlptr = strchr(temp, '?');//ka8e fora vriskei to epomeno ?
            if (nlptr) 
            {
                for(j=1;j<10;j++)
                {
                    *nlptr = myItoc(j);//antikatastasi tou ? me digits sto temp
                    strcpy(table2[i],temp);
                    i++;
                }
            }
            l++;
        }
        table1=table2;
        limit=i;
    k++;
    }

    printf("\nWild Numbers out:");
    for(i=0;i<limit;i++)
    {
        printf("\n%s",table1[i]);
    }

}

Если мне malloc нравится:

char ** table1
char ** table2

table1=malloc(sizeof(char)*10^length*lenght)
table2=malloc(sizeof(char)*10^length*lenght)

Как программа узнает, когда заканчивается каждая запись

Тогда что бы это значило: table1 [1]?наверное ничего ...

Заранее спасибо

1 Ответ

1 голос
/ 05 ноября 2011

Когда вы malloc двумерный массив, вы не можете создать что-то идентичное тому, что компилятор сделал бы для объявления массива. char a[100][50] - это непрерывный блок памяти, 5000 char. Когда вы подписываете его, компилятор может выполнять математику строки / столбца, потому что он знал размер во время компиляции. Когда вы malloc эквивалентный двумерный массив, вы должны предоставить массив строк, который индексирует строки. Вот как вы отвечаете на свой вопрос «как программа узнает, когда заканчивается каждая запись»:

char **b;
int i;
int rows = 100;
int cols = 50;
/* using sizeof(*b) is a good habit because there's only */
/* one place where you have to change type information */
b = malloc(rows * sizeof(*b));
/* now create a bunch of rows */
for (i = 0; i < rows; ++i) {
    b[i] = malloc(cols * sizeof(**b));
}

Обратите внимание, что это занимает больше памяти, чем объявленный массив из-за индексного массива rows.

В качестве оптимизации вы можете избежать повторения malloc в цикле и выделить память из одного большого выделения rows * cols * sizeof(**b).

Позаботьтесь, чтобы вы написали соответствующую функцию для free вашего массива.

...