Вход на сайт
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 17:24
в ответ 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
Ты копируешь указатель, а не содержимое памяти, на которую он указывает.
06.10.06 17:46
в ответ 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:59
в ответ evgher 06.10.06 18:43
"Ha" - это так называемый "string literal". В соответствии со стандартом имплементируется как массив с временем жизни равным времени жизни программы в неизменемом отделе памяти. Если ты попытаешься его изменить, то результаты будут зависеть от конкретной имплементации, то бишь от компайлера и операционной ситемы. Может изменится, а может получишь то, что ты имеешь. То есть по хорошему так делать нельзя.
Значит литерал "На" присваевается как константная.
Я не понимаю, что ты имеешь в виду. А ты видимо не понимаешь указателей.
Значит литерал "На" присваевается как константная.
Я не понимаю, что ты имеешь в виду. А ты видимо не понимаешь указателей.
NEW 06.10.06 19:21
Извиняюсь, я имел ввиду что присваевается адрес, указывающий на константный литерал "На".
Хороший коментар
Так значит аллокируемая память - malloc(20*sizeof(char)) - остаётся до конца программы
где-то висеть, т.к. не существует больше переменной, указывающей на её местонахождение.
Всё понятно. Спасибо.
В ответ на:
Я не понимаю, что ты имеешь в виду. А ты видимо не понимаешь указателей.
Я не понимаю, что ты имеешь в виду. А ты видимо не понимаешь указателей.
Хороший коментар

Так значит аллокируемая память - malloc(20*sizeof(char)) - остаётся до конца программы
где-то висеть, т.к. не существует больше переменной, указывающей на её местонахождение.
Всё понятно. Спасибо.
NEW 15.10.06 11:58
в ответ 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
);
Я вам один умный вещь скажу - но только вы не обижайтесь...