LINUX.ORG.RU

это верно в С?


0

0

вот такую строчку заделал студент
if (str == NULL)
{
   str = "";
}

str это сhar*.
Мне такое дело "глаз режет". Это верно? Какую критику можно навести?
anonymous

Если это чистый C то никакой, разве что правельней писать
if (NULL == str)
Но если это C++ то происходит нарушение типов, и компилятор должен выдовать предупреждение.

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

"" это по моему const char * и в Си и в Си++, значит происходит дискард конст. Который легален если потом туда ничего реально не пишут.

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

String literals имеют тип char * а не const char * -- но при этом изменять их запрещается. Это несколько странно, но таков стандарт.

aa5779
()

проблема тут в другом. Студент в str запихнул адрес пустой строки которая лежит в стеке

{
str = "";
}

соответственно после выхода из стека str будет указывать на мусор который остался в стеке или на чтото что там будет определенно после выхода из него.

Например:

if (str == NULL) {
str = "";
}

{
char *a = "hello world\0";
printf(str);
}


этот кусок должен будет распечатать "hello world"

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

Нда... Вообщето строка "" равносильна массиву в один байт, содержащий '\0', то есть пустой строке.. И в str помещается указатель на него. printf ничего не напечатает, ибо строка пуста.
Другой вопрос, что скорее всего студент хотел написать что-то типа

if(str==NULL)
{
str[0]=0;
}

Если конечно str указывает на что-то приличное, типа массива.
Хотя это совершенно не обязательно.
Если какие-то вопросы копмпильте так

gcc -Wall -ansi -pedantic test.c

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

> проблема тут в другом. Студент в str запихнул адрес пустой строки которая лежит в стеке

{ str = ""; }

соответственно после выхода из стека str будет указывать на мусор который остался в стеке или на чтото что там будет определенно после выхода из него.

нет.. "" не лежит в стеке, это статический объект.

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

Да, согласен. Эта пустая строка лежит не в стеке а в сегменте данных. Поэтому все нормльно.

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