русский
Germany.ruForen → Архив Досок→ Programmierung

Sting in C

186  
evgher завсегдатай06.10.06 16:27
evgher
NEW 06.10.06 16:27 
Formuliere mein Anliegen etwas anders.
Wenn ich die Eingabe so gestalte(siehe unten), gibt es keine Fehler!
1: char *str = (char *)malloc(200*sizeof(char));
2: str[0] = 'H'; str[1] = 'a'; str[3] = '\0';
3: *(str+1) = '\0';
Wenn ich das anders eingebe (siehe unten), kommt es zu einem Speicherzugriffsfehler.
Wieso?
1: char *str = (char *)malloc(200*sizeof(char));
2: str = "Ha";
3: *(str+1) = '\0';
#1 
Simple Nothing is f*cked06.10.06 16:46
Simple
NEW 06.10.06 16:46 
in Antwort evgher 06.10.06 16:27
Ты присваиваешь указателю временный адрес. Правильно будет:
2: strcpy(str, "Ha");
#2 
evgher завсегдатай06.10.06 17:05
evgher
NEW 06.10.06 17:05 
in Antwort Simple 06.10.06 16:46
Почему? Указатель не может здесь иметь временный адрес.
Читать я переменную же в состоянии. Но содержимое
переменной почему-то таким образом изменить не получается.
#3 
Simple Nothing is f*cked06.10.06 17:24
Simple
NEW 06.10.06 17:24 
in Antwort evgher 06.10.06 17:05
Что такое "Ha" по-твоему? const char*. Таким образом, ты присваиваешь указателю str адрес временной переменной "Ha". Результат известен.
Возьмем похожую ситуацию:
int* p1 = new int(10); // *p1 = 10
int* p2 = new int(20); // *p2 = 20
p1 = p2; // *p1 = 20
delete p2; // *p1 undefined

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

#4 
  scorpi_ 06.10.06 17:46
NEW 06.10.06 17:46 
in Antwort Simple 06.10.06 17:24
Таким образом, ты присваиваешь указателю str адрес временной переменной "Ha".
Она не временная. Она очень даже константная. В этом-то и проблема. string literal is a non-modifiable array of static storage duration. If the program attempts to modify such an array, the behavior is
undefined. ISO/IEC 9899:1999 6.4.5
#5 
evgher завсегдатай06.10.06 18:43
evgher
NEW 06.10.06 18:43 
in Antwort scorpi_ 06.10.06 17:46
Ой огромное вам всем спасибо.
Я сразу думал, что здесь происходит что-то по умолчанию.
Значит литерал "На" присваевается как константная.
#6 
  scorpi_ 06.10.06 18:59
NEW 06.10.06 18:59 
in Antwort evgher 06.10.06 18:43
"Ha" - это так называемый "string literal". В соответствии со стандартом имплементируется как массив с временем жизни равным времени жизни программы в неизменемом отделе памяти. Если ты попытаешься его изменить, то результаты будут зависеть от конкретной имплементации, то бишь от компайлера и операционной ситемы. Может изменится, а может получишь то, что ты имеешь. То есть по хорошему так делать нельзя.
Значит литерал "На" присваевается как константная.
Я не понимаю, что ты имеешь в виду. А ты видимо не понимаешь указателей.
#7 
evgher завсегдатай06.10.06 19:21
evgher
NEW 06.10.06 19:21 
in Antwort scorpi_ 06.10.06 18:59, Zuletzt geändert 06.10.06 19:24 (evgher)
Извиняюсь, я имел ввиду что присваевается адрес, указывающий на константный литерал "На".
В ответ на:
Я не понимаю, что ты имеешь в виду. А ты видимо не понимаешь указателей.

Хороший коментар
Так значит аллокируемая память - malloc(20*sizeof(char)) - остаётся до конца программы
где-то висеть, т.к. не существует больше переменной, указывающей на её местонахождение.
Всё понятно. Спасибо.
#8 
Simple Nothing is f*cked06.10.06 19:45
Simple
NEW 06.10.06 19:45 
in Antwort scorpi_ 06.10.06 17:46
Да, точно.
#9 
Simple Nothing is f*cked06.10.06 19:46
Simple
NEW 06.10.06 19:46 
in Antwort evgher 06.10.06 19:21
В ответ на:
Так значит аллокируемая память - malloc(20*sizeof(char)) - остаётся до конца программы
где-то висеть, т.к. не существует больше переменной, указывающей на её местонахождение.

И это тоже, но твой вопрос изначально был о другом ;)
#10 
evgher завсегдатай06.10.06 19:52
evgher
NEW 06.10.06 19:52 
in Antwort Simple 06.10.06 19:46
В ответ на:
И это тоже, но твой вопрос изначально был о другом ;)

Не совсем так.
Я всё время думал что литерал будет обязательно записан в
отведённую память (ведь я же её с этой целью и отвёл)
#11 
Simple Nothing is f*cked06.10.06 19:54
Simple
06.10.06 19:54 
in Antwort evgher 06.10.06 19:52
Ну, это я понял и пытался объяснить тебе, что это невозможно :) Если ты пишешь на чистом С, используешь strcpy и тому подобные, если на C++ - std::string, и вот там-то ты можешь присваивать напрямую.
#12 
Такой-сякой гость15.10.06 11:58
Такой-сякой
NEW 15.10.06 11:58 
in Antwort Simple 06.10.06 19:54
Лучше char *strncpy( char *strDest, const char *strSource, size_t count );
Еще лучше (для совместимости с юникод) _tcsncpy(TCHAR *strDest, const TCHAR *strSource, size_t count);
И наконец самое лучшее:
LPTSTR lstrcpyn(
LPTSTR lpString1, // destination buffer
LPCTSTR lpString2, // string
int iMaxLength // number of characters to copy
);
Я вам один умный вещь скажу - но только вы не обижайтесь...
#13 
  Chipolino знакомое лицо15.10.06 16:56
NEW 15.10.06 16:56 
in Antwort Такой-сякой 15.10.06 11:58
В ответ на:

И наконец самое лучшее:
LPTSTR lstrcpyn(
LPTSTR lpString1, // destination buffer
LPCTSTR lpString2, // string
int iMaxLength // number of characters to copy
);

Самое лучшее решение с какой библиотеки ?
И чем оно самое лучшее ?
#14