Login
Sting in C
186
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';
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';
NEW 06.10.06 16:46
in Antwort evgher 06.10.06 16:27
NEW 06.10.06 17:05
in Antwort Simple 06.10.06 16:46
Почему? Указатель не может здесь иметь временный адрес.
Читать я переменную же в состоянии. Но содержимое
переменной почему-то таким образом изменить не получается.
Читать я переменную же в состоянии. Но содержимое
переменной почему-то таким образом изменить не получается.
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
Ты копируешь указатель, а не содержимое памяти, на которую он указывает.
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
Она не временная. Она очень даже константная. В этом-то и проблема. 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
NEW 06.10.06 18:43
in Antwort scorpi_ 06.10.06 17:46
Ой огромное вам всем спасибо.
Я сразу думал, что здесь происходит что-то по умолчанию.
Значит литерал "На" присваевается как константная.
Я сразу думал, что здесь происходит что-то по умолчанию.
Значит литерал "На" присваевается как константная.
NEW 06.10.06 18:59
in Antwort evgher 06.10.06 18:43
"Ha" - это так называемый "string literal". В соответствии со стандартом имплементируется как массив с временем жизни равным времени жизни программы в неизменемом отделе памяти. Если ты попытаешься его изменить, то результаты будут зависеть от конкретной имплементации, то бишь от компайлера и операционной ситемы. Может изменится, а может получишь то, что ты имеешь. То есть по хорошему так делать нельзя.
Значит литерал "На" присваевается как константная.
Я не понимаю, что ты имеешь в виду. А ты видимо не понимаешь указателей.
Значит литерал "На" присваевается как константная.
Я не понимаю, что ты имеешь в виду. А ты видимо не понимаешь указателей.
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)) - остаётся до конца программы
где-то висеть, т.к. не существует больше переменной, указывающей на её местонахождение.
Всё понятно. Спасибо.
В ответ на:
Я не понимаю, что ты имеешь в виду. А ты видимо не понимаешь указателей.
Я не понимаю, что ты имеешь в виду. А ты видимо не понимаешь указателей.
Хороший коментар

Так значит аллокируемая память - malloc(20*sizeof(char)) - остаётся до конца программы
где-то висеть, т.к. не существует больше переменной, указывающей на её местонахождение.
Всё понятно. Спасибо.
NEW 06.10.06 19:46
И это тоже, но твой вопрос изначально был о другом ;)
in Antwort evgher 06.10.06 19:21
В ответ на:
Так значит аллокируемая память - malloc(20*sizeof(char)) - остаётся до конца программы
где-то висеть, т.к. не существует больше переменной, указывающей на её местонахождение.
Так значит аллокируемая память - malloc(20*sizeof(char)) - остаётся до конца программы
где-то висеть, т.к. не существует больше переменной, указывающей на её местонахождение.
И это тоже, но твой вопрос изначально был о другом ;)
NEW 06.10.06 19:52
Не совсем так.
Я всё время думал что литерал будет обязательно записан в
отведённую память (ведь я же её с этой целью и отвёл)
in Antwort Simple 06.10.06 19:46
В ответ на:
И это тоже, но твой вопрос изначально был о другом ;)
И это тоже, но твой вопрос изначально был о другом ;)
Не совсем так.
Я всё время думал что литерал будет обязательно записан в
отведённую память (ведь я же её с этой целью и отвёл)
NEW 06.10.06 19:54
in Antwort evgher 06.10.06 19:52
Ну, это я понял и пытался объяснить тебе, что это невозможно :) Если ты пишешь на чистом С, используешь strcpy и тому подобные, если на C++ - std::string, и вот там-то ты можешь присваивать напрямую.
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
);
Еще лучше (для совместимости с юникод) _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
);
Я вам один умный вещь скажу - но только вы не обижайтесь...
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
);
И наконец самое лучшее:
LPTSTR lstrcpyn(
LPTSTR lpString1, // destination buffer
LPCTSTR lpString2, // string
int iMaxLength // number of characters to copy
);
Самое лучшее решение с какой библиотеки ?
И чем оно самое лучшее ?