Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вернуть указатель на массив. 
V
    Опции темы
ky0x5a
Дата 5.8.2011, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 17.5.2011

Репутация: нет
Всего: нет



Доброе время суток, вот ф-ция:

Код

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 внутри ф-ции то выводится ожидаемый результат.  Что я не так делаю? 
PM MAIL   Вверх
Greeneyed
Дата 5.8.2011, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 20.4.2006

Репутация: нет
Всего: нет



А тебя не смущает, что ты возвращаешь указатель на  char drvs[24], который создается внутри функции, а значит после выхода из функции он удаляется? А значит после выхода из функции по этому адресу может лежать что угодно.
PM MAIL   Вверх
asmdzen
Дата 5.8.2011, 15:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



попробуй поставить static перед char drvs[24];
PM MAIL   Вверх
Greeneyed
Дата 5.8.2011, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 20.4.2006

Репутация: нет
Всего: нет



А еще лучше передавать в ExtractDriveName указатель на массив, аналогичный char drvs[24] и работать уже с ним. Хотя вариант от  asmdzen, тоже может прокатить.
PM MAIL   Вверх
shara
Дата 5.8.2011, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: 2
Всего: 2



 smile 
добавит вашему коду понятности
Код

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


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

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





--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
baldina
Дата 5.8.2011, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Код

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;
}

PM MAIL   Вверх
ky0x5a
Дата 8.8.2011, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 17.5.2011

Репутация: нет
Всего: нет



Спс парни, на СИ давно не писал, только PERL.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0438 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.