Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Вернуть указатель на массив.


Автор: ky0x5a 5.8.2011, 14:21
Доброе время суток, вот ф-ция:

Код

char * ExtractDriveName(void){
    char drvs[24];
    char *pDrvs = drvs;
    int d, j=0;

    for(d = 97; d <= 122; d++)
    {
        char buf[3];
        int drvid;
        sprintf(buf, "%c:", d);
        drvid = GetDriveType(buf);
        if(drvid == DRIVE_REMOVABLE || drvid == DRIVE_FIXED || drvid == DRIVE_REMOTE || drvid == DRIVE_RAMDISK) drvs[j++] = d;
    }
    drvs[j] = '\0';

    return pDrvs;
}


При ее вызове printf("%s\n", ExtractDriveName()); в результате виден мусор символов вместо строки имен разделов hdd, но если вывести принтом pDrvs перед return внутри ф-ции то выводится ожидаемый результат.  Что я не так делаю? 

Автор: Greeneyed 5.8.2011, 15:00
А тебя не смущает, что ты возвращаешь указатель на  char drvs[24], который создается внутри функции, а значит после выхода из функции он удаляется? А значит после выхода из функции по этому адресу может лежать что угодно.

Автор: asmdzen 5.8.2011, 15:04
попробуй поставить static перед char drvs[24];

Автор: Greeneyed 5.8.2011, 16:00
А еще лучше передавать в ExtractDriveName указатель на массив, аналогичный char drvs[24] и работать уже с ним. Хотя вариант от  asmdzen, тоже может прокатить.

Автор: shara 5.8.2011, 16:17
 smile 
добавит вашему коду понятности
Код

for(d = 'a'; d <= 'z'; d++)


да и лишний указатель можно убрать за ненадобностью
Код

    drvs[j] = '\0';
    return drvs;



Автор: baldina 5.8.2011, 17:33
Код

char * ExtractDriveName (char *drvs, int size) {
    --size;
    char *pDrvs = drvs;
    char buf[3] = " :";
    for(buf[0] = 'a'; buf[0] <= 'z' && pDrvs - drvs < size; ++buf[0]) {
        int drvid = GetDriveType (buf);
        if(drvid == DRIVE_REMOVABLE || drvid == DRIVE_FIXED || drvid == DRIVE_REMOTE || drvid == DRIVE_RAMDISK) 
          *pDrvs++ = buf[0];
    }
    *pDrvs = '\0';
    return drvs;
}

Автор: ky0x5a 8.8.2011, 08:52
Спс парни, на СИ давно не писал, только PERL.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)