2017-01-26 3 views
-3

Имея некоторые проблемы, сравнивающие массивы символов через указатели. Я работаю без библиотеки строк и iostream, хотел бы сохранить ее таким образом.Сравнение указателей (массив символов) в C/C++

char *GetCurrentPath() 
{ 
char buffer[MAX_PATH]; 
if (!GetModuleFileNameA(NULL, buffer, MAX_PATH)) { 
    printf("GetModuleFileNameA failed, error: %d\n", GetLastError()); 
} 
return (buffer); 


} 
char *GetInstallPath() 
{ 
char buffer[MAX_PATH]; 
if (!SHGetSpecialFolderPathA(NULL, buffer, CSIDL_APPDATA, FALSE)) { 
    printf("SHGetSpecialFolderPathA failed, error: %d\n", GetLastError()); 
} 
strcat(buffer, "\\service.exe"); 

    return (buffer); 
} 



char *InstallPath = GetInstallPath(); 
char *CurrentPath = GetCurrentPath(); 

if (InstallPath == CurrentPath)...... 

Оператор if вызывает мгновенный сбой, то же самое относится к strcomp.

Предложения?

+0

Вы не можете безопасно возвращать указатели на локальные переменные. –

+0

Подсказка: эти два указателя * никогда не будут одинаковыми ... Вы используете синтаксис 'string' библиотеки для простых строк' char * '. – usr2564301

+1

Можете ли вы уточнить, на каком языке вы используете - ** либо C, либо C++ **? В вашем заголовке и тегах упоминаются обе, что невозможно (вероятно, поэтому отредактирован тег «C++»). Однако утверждение «без строковой библиотеки и iostream» * сильно * предлагает C++. – usr2564301

ответ

2

Что вы сейчас делаете, это неопределенное поведение. Буферы, которые вы используете в двух функциях, определяются локально для этих функций и выходят за пределы области действия, когда функции заканчиваются, что дает вам указатели на случайные адреса стека.

Вам нужно либо выделить буферы в функции:

Заменить: char buffer[MAX_PATH];

С: char *buffer = new char[MAX_PATH]

Или передать выделенные буферы от вашей основной для функций:

char *InstallPath = new char[MAX_PATH]; 
GetInstallPath(InstallPath); 

И измените свои функции получения пути:

char *GetInstallPath(char *buffer) 

В обоих случаях вам нужно будет удалить указатели, прежде чем заканчивать свою программу, чтобы освободить память.

Кроме того, при попытке сравнить две переменные они будут сравнивать адреса указателей, а не содержимое строки. Вам нужно будет использовать strcmp() или что-то в этом семействе функций.

+0

Значит, указатель не указывает на возвращаемое значение функций? –

+0

@MelvinLangvik Возвращаемое значение функции недопустимо, так как оно содержит адрес локальной переменной, которая больше не находится в области видимости. –

+0

Ahh, поэтому я указываю на функцию, возвращающую значение вне области видимости, из-за возвращаемого значения, которое она сама является указателем, поэтому указывает на что-то внутри локальной области действия функции. –

0

Ваши функции возвращают массив (char *), объявленный локально внутри них. У ваших указателей есть неопределенные значения вне функций. Вы не можете этого сделать.

Вы можете выделить их динамически:

char *buffer = malloc(MAX_PATH*sizeof(char)); 
0

Поскольку оба буфера выделяются в стеке, они будут освобождены после завершения выполнения функции. Таким образом, функция указателей возвращается к недействительной.

Чтобы исправить это, вы должны выделить буфер [] в куче, используя char * buffer = new char [MAX_PATH];

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