LINUX.ORG.RU

Указатели в C


0

0

Здравствуйте. Если не затруднит, подскажите, почему так:

Имеется структура. Например, такая:

struct simplestruct { char * field1; char * field2; };

Имеется функция, такая, например:

void func(struct simplestruct * simple) { char * temp = simple->field1; temp = malloc(256); strcpy(temp, "Somestring"); printf(simple->field1); }

Почему printf выводит мусор? Я только изучаю C, поэтому сильно прошу не бить. Спасибо.

anonymous

Здравствуйте. Если не затруднит, подскажите, почему так:

Имеется структура. Например, такая:

struct simplestruct { 
   char * field1; 
   char * field2; 
};

Имеется функция, такая, например:

void func(struct simplestruct * simple) { 
   char * temp = simple->field1; 
   temp = malloc(256); 
   strcpy(temp, "Somestring"); 
   printf(simple->field1); 
}

Почему printf выводит мусор? Я только изучаю C, поэтому сильно прошу не бить. Спасибо. 

anonymous
()
Ответ на: комментарий от anonymous

Разберём по строкам.
>void func(struct simplestruct * simple) { 
>   char * temp = simple->field1; 
объявляем переменную temp, присваиваем ей simple->field1, видимо она сейчас указывает в мусор.
>   temp = malloc(256); 
теперь ей же присваиваем НОВОЕ значение, возвращаемое функцией malloc. При этом в simple->field1 остаётся старое значение, которое указывает, видимо, в мусор.
>   strcpy(temp, "Somestring"); 
Копируем в память, на которую указывает temp строку Somestring С ЗАВЕРШАЮЩИМ НУЛЁМ, здесь всё нормально.
>   printf(simple->field1); 
Печатаем то, на что указывает simple->field1, т.е. мусор. А можем и упасть здесь, если повезёт.
>}
Приехали.

Legioner ★★★★★
()
Ответ на: комментарий от wfrr

>Нулика в конце строки немае?

Я неудачный пример привел. На самом деле там переменная ( strcpy(temp, str)). Строка C-стиля правильная, с символом конца строки. Кроме того, ведь strcpy сам добавляет \0. Проблема в том, что, если делать malloc+strcpy для непосредственно simple->field1, то printf выводит все нормально, а если для указателя temp, то выходит мусор :(

anonymous
()
Ответ на: комментарий от anonymous

char * temp = simple->field1; (temp указывает на field1)
temp = malloc(256); (temp указывает на новую область
памяти, field1 без изменения)
strcpy(temp, "Somestring"); (пишешь в новую область памяти)

field1 не поменялся.

Про следующий шаг с '\0' тебе написали сверху.

ttnl ★★★★★
()
Ответ на: комментарий от anonymous

Нет, нужно использовать указатель на указатель, если я конечно правильно понял то, что вы пытались сделать.

Legioner ★★★★★
()

> char * temp = simple->field1; temp = malloc(256);

Ты temp инициализируешь как simple->field1, а потом тут же даёшь ему новое значение. Что сказать хотел?

А simple->field1 ты вообще не меняешь, в нём как был мусор, так и остался.

anonymous
()
Ответ на: комментарий от ttnl

>Про следующий шаг с '\0' тебе написали сверху.

С '\0' уже выяснили. Здесь все верно.

anonymous
()
Ответ на: комментарий от Legioner

>Нет, нужно использовать указатель на указатель, если я конечно правильно понял то, что вы пытались сделать.

Да, правильно. Подскажите пожалуйста, как это правильно сделать?

anonymous
()
Ответ на: комментарий от swizard

может все-таки лучше так:

simple->field1 = malloc(256); strncpy(simple->field1, str, 255); simple->field1[255] = 0;

no1sm ★★
()
Ответ на: комментарий от swizard

>char ** temp = &simple->field1; 
>*temp = malloc(256);

struct simplestruct * temp = simple;
temp->field1 = malloc(256);

Какой код выглядит проще ? Или по принципу - а почему "Ы" - а чтоб никто
не догадался ? А потом говорят С указатели это полная ж.

koTuk
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.