Само искам да поясня нещо. Препоръчваният синтаксис
char* string = new char[7]
не е C синтаксис! Това е C++ синтаксис и по принцип, ако
трябва да се придържаме към C++ традицията, след това
вместо printf/scanf и т.н. трябва да се използва cout/cin.
Но
сега да отговоря на първоначалния въпрос. Това е често
срещанa грешка при начинаещите, когато работят със
стрингове. Проблемът е, че командата
char *string;
наистина създава указател към стринг, което ще рече
инициализира се променлива, която съдържа адрес в
паметта от сорта на 432864 (съвсем произволно го казвам,
адресите в паметта излгеждат малко по-различно и се
задават в шестнадестичен вид, но в случая това няма
значение), просто си представяй, че към клетка номер
432864 сочи string. Адреса можеш да получиш с
printf("%f", string);
Това може и да е 000000! Абсолютно произволно е. И
най-важното, на това място в паметта може и да има,
може и да няма важни данни, които могат да използват и
върху които може да се записва. Сега, каква е цаката:
трябва да присвоиш на променливата string стойност, която
отговаря на някой адрес в паметта, за който е специално
указано, че трябва да бъде резервиран за твоята цел. И
по-точно, ако трябва низът да е по-дълъг, то и
"последващите го" адреси ще бъдат резервирани. Това се
прави, както беше споменато вече в C++ с оператора new,
а в C се прави с фунцията malloc от библиотеката <stdlib.h>.
С код:
#include <stdlib.h>
int main() {
char* my_string = malloc (255 * sizeof(char));
strcpy(my_string, "blabla");
printf(my_string);
free(my_string);
return 0;
}
Забележи, че my_string = "blabla" би било грешно, т.к. това
би присвоило на самия указател стойност blabla, а
*my_string = "blabla" би дало предупреждения при
компилация и може да има непредвидени резултати, т.к.
по-същество е глупост (?).
Има само една книга за C, и Kernighan и Ritchie са нейните
пророци: "The C Programming Language". И забележи някои
неща. Една програма на C често работи, въпреки че не е
коректно написана, тъй като компилаторът налага много малко
отграчния и тогава се хващаш за главата, когато след два-три
часа идва segfault. В тоя случай може да помогне purify
(цена от рода на $ 5000) и demalloc (вж. google) или както
казва Линукс Торвалдс, намираш с gdb къде дропи и после
гледаш много внимателно и мислиш...
Поздрави,
КейН
|