Почему такой результат?

Микола Питерский
Дата: 18.12.2014 12:21:01
const char* md5a(const char* str){
  char str1[10], str2[10];

  strcpy(str1, "Hello");
//  strcpy(str2, str1);

  return &str1;
}

const char* destination = md5a(str);
return (*pEnv)->NewStringUTF(pEnv, destination);



Функция возвращает результат верно: "Hello", но если раскоментировать строку - то возврат "ello".

Почему так???
Dimitry Sibiryakov
Дата: 18.12.2014 12:45:54

Микола Питерский
Почему так???

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

Posted via ActualForum NNTP Server 1.5

Микола Питерский
Дата: 18.12.2014 12:50:38
Dimitry Sibiryakov, давай без бла-бла - не хочешь помочь так и не надо - или тебе за количество пустых коментов платят?
Anatoly Moskovsky
Дата: 18.12.2014 13:00:02
Микола Питерский,

Нельзя возвращать из функции указатель на локальную переменную. Запрещено.
Перепишите код без возврата такого указателя и все заработает.
Dima T
Дата: 18.12.2014 13:02:53
Твой str1[10] после выполнения return превращается в кусок свободной памяти стэка и может быть в любой момент занят другой переменной.
Пиши так:
static char str1[10];
Микола Питерский
Дата: 18.12.2014 13:04:20
Anatoly Moskovsky, дело в том что я понял суть проблемы - но не знаю как это сделать по другому. Мне нужно из функции возвратить строковое значение - как переписать пример чтобы надежно работал? Раньше передавал это значение через пар-р функции - все работало, но теперь хочу переписать на возврат его из функции - или это невозможно?
Микола Питерский
Дата: 18.12.2014 13:15:20
Dima T
Твой str1[10] после выполнения return превращается в кусок свободной памяти стэка и может быть в любой момент занят другой переменной.
Пиши так:
static char str1[10];


Спасибо - теперь работает нормально. А есть ли более правильный способ это делать?

Вот я еще так делаю:

char* ret='\0'; 
...
if (fid == 0 ) goto END;
...
ret=(char*) malloc(strlen(tmp)+1);
strcpy(ret, tmp );
ret[strlen(ret)] = '\0';

END:
return ret; // const char*


Есть ли в этом примере какие подводные камни?
Dima T
Дата: 18.12.2014 13:18:16
Забыл добавить что со static нельзя два указателя использовать, первый поменяется. Запусти
const char* f()
{
  static char ret[10];
  if(ret[0] == 'A') {
	  ret[0] = 'B';
  } else {
	  ret[0] = 'A';
  }
  ret[1] = 0;
  return ret;
}

int main() 
{
	const char* p1 = f();
	puts(p1);
	const char* p2 = f();
	puts(p2);
	puts(p1);
	return 0;
}
Dima T
Дата: 18.12.2014 13:23:37
Микола Питерский
...
ret=(char*) malloc(strlen(tmp)+1);
...
return ret; // const char*


Есть ли в этом примере какие подводные камни?

Надо чтобы потом была освобождена память, когда значение станет ненужно. Т.е. так
const char* destination = md5a(str);
...
free(destination);

иначе это утечка памяти.
Микола Питерский
Дата: 18.12.2014 13:26:16
Dima T, спасибо большое - теперь понял где у меня были косяки:)