Как определить длину массива 2D беззнаковых коротких указателей в c ++ - PullRequest
0 голосов
/ 28 апреля 2010

Мне трудно определить длину столбцов в двумерном массиве коротких указателей без знака. Насколько я знаю, я правильно распределил память. и может печатать их правильно.

PLZ см. Следующий сегмент кода:

int number_of_array_index_required_for_pointer_abc=3;
char A[3][16];


strcpy(A[0],"Hello");
strcpy(A[1],"World");
strcpy(A[2],"Tumanicko");


cout<<number_of_array_index_required_for_pointer_abc*sizeof(unsigned short)<<endl;
unsigned short ** pqr=(unsigned short **)malloc(number_of_array_index_required_for_pointer_abc*sizeof(unsigned short));




    for(int i=0;i<number_of_array_index_required_for_pointer_abc;i++)
    {

        int ajira = strlen(A[i])*sizeof(unsigned short);
        cout<<i<<" = "<<ajira<<endl;
        pqr[i]=(unsigned short *)malloc(ajira);
        cout<<"alocated pqr[i]= "<<sizeof pqr<<endl;


        int j=0;
        for(j=0;j<strlen(A[i]);j++)
        {
            pqr[i][j]=(unsigned short)A[i][j];

        }
        pqr[i][j]='\0';


    }


    for(int i=0;i<number_of_array_index_required_for_pointer_abc;i++)
    {

        //ln= (sizeof pqr[i])/(sizeof pqr[0]);

        //cout<<"Size of pqr["<<i<<"]= "<<ln<<endl;


         // I want to know the size of the columns i.e. pqr[i]'s length instead of finding '\0'

         for(int k=0;(char)pqr[i][k]!='\0';k++)
        cout<<(char)pqr[i][k];
        cout<<endl;

    }

Ответы [ 2 ]

0 голосов
/ 28 апреля 2010

Ты почти у цели.У вас есть этот цикл:

for(int k=0;(char)pqr[i][k]!='\0';k++) ...

Как только этот цикл будет завершен, k будет иметь длину строки.Так что это даст вам длину pqr[i] (не включая нулевой терминатор):

int k;
for (k=0; pqr[i][k] != 0; k++)
    ;
cout<<"The length is "<< k <<endl;

Редактировать :

Вы добавили, что выхочу узнать размер, даже если нулевого терминатора там нет.Нет способа сделать это.Вам нужно будет иметь какой-то терминатор или хранить размер где-нибудь.Если вы используете vector<unsigned short>, он сохранит размер для вас.Поскольку он также обрабатывает распределение и освобождение, это рекомендуемый выбор.


Обратите внимание, что в вашем выделении есть две ошибки:

  1. pqr - это массив указателей, но вы выделяете размер C*sizeof(unsigned short).вместо этого должно быть C*sizeof(unsigned short *).

  2. Вы не выделяете память для нулевого терминатора в конце каждой строки: вы должны выделить (strlen(A[i])+1) * sizeof(unsigned short) для каждой строки.

0 голосов
/ 28 апреля 2010

У вас есть ошибка в этой строке:

pqr[i][j]='\0';

На данный момент j равно strlen(A[i]) - что находится за пределами, которые вы установили для pqr:

int ajira = strlen(A[i])*sizeof(unsigned short);
pqr[i]=(unsigned short *)malloc(ajira);

pqr[i] идет от [0] до [strlen(A[i])-1], поэтому запись в pqr[i][strlen(A[i])] переполняет массив. Компилятор не поймет это, поскольку вы сами распределили память.

Решение этой ошибки - сделать malloc(ajira+sizeof(unsigned short))

Отредактировано после комментариев

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...