@polger

Почему затирается часть массива в Си?

Получаю список дисков и специально добавляю две строки "ABC" и "DEF" в массив allDisks.
После прохождения массива функцией get_files список дисков исчезает, но "ABC" и "DEF" остаются.
Подскажите, почему так происходит, куда теряются первые строки и как исправить?
#include <windows.h>
#include <stdio.h>
#include <string.h>

#define MAX_COUNT_DISKS 26

void get_disks(char * allDisks[])
{
	char buf[128];
	int i = 0;

	GetLogicalDriveStringsA(sizeof(buf), buf);
	for (char *s = buf; *s; s += strlen(s) + 1)
	{
		if (GetDriveTypeA(s) == 2 || GetDriveTypeA(s) == 3)
		{
			allDisks[i] = s;
			++i;

			allDisks[7] = "ABC";
			allDisks[8] = "DEF";
		}
	}
}

void get_files(char * allDisks[])
{

}

int main()
{
	char * allDisks[MAX_COUNT_DISKS] = { 0 };

	get_disks(allDisks);
	get_files(allDisks);

	return 0;
}

5c464df12df17688188162.jpeg
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert

void get_disks(char * allDisks[])
{
  char buf[128];
  ...
  for (char *s = buf; *s; s += strlen(s) + 1)
  {
      ...
      allDisks[i] = s;
      ...
      allDisks[7] = "ABC";
      allDisks[8] = "DEF";
  }
}


После прохождения массива функцией get_files список дисков исчезает, но "ABC" и "DEF" остаются.
Подскажите, почему так происходит, куда теряются первые строки и как исправить?

Так происходит потому что ты кладёшь в allDisks указатели на стековый массив buf, который разрушается после выхода из функции get_disks. А строчки "ABC" и "DEF" -- константные строчки, существуют всё время выполнения программы.
Исправить можно, например, выделив память для строчек, которые записываются в allDisks:

void get_disks(char * allDisks[])
{
  char buf[128];
  int i = 0;

  GetLogicalDriveStringsA(sizeof(buf), buf);
  for (char *s = buf; *s; s += strlen(s) + 1)
  {
    if (GetDriveTypeA(s) == 2 || GetDriveTypeA(s) == 3)
    {
      allDisks[i] = strdup(s);
      ++i;

      allDisks[7] = "ABC";
      allDisks[8] = "DEF";
    }
  }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Alexeytur
@Alexeytur
allDisks[i] = s;
здесь вы присваиваете переменной указатель на кусок памяти находящейся в переменной
char buf[128];
,а эта переменная является локальной автоматической в функции, и после выхода этот кусок памяти переиспользуется программой.
Как исправить: здесь
allDisks[i] = s;
создавать копию строки. Или использовать статический буфер. Точнее не подскажу, давно не работал с Си.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы