2013-06-13 2 views
-2

У меня есть следующий фрагмент код, который дает мне предупреждение при компиляции (код работает так или иначе):C (Linux): предупреждение: назначение отбрасывает отборочные от целевого указателя типа

char *x_first_name, *x_last_name, *x_address, *x_zip; 

const size_t firsts_count = sizeof(firsts)/sizeof(firsts[0]); 
const size_t lasts_count = sizeof(lasts)/sizeof(lasts[0]); 
const size_t streets_count = sizeof(streets)/sizeof(streets[0]); 
const size_t zips_count = sizeof(zips)/sizeof(zips[0]); 

srand(time(NULL)); 

x_first_name = firsts[rand() % firsts_count]; // line 69 
x_last_name = lasts[rand() % lasts_count]; // line 70 
x_address = streets[rand() % streets_count]; // line 71 
x_zip = zips[rand() % zips_count]; // line 72 

Предупреждения компиляции:

authorize.c: In function 'main': 
authorize.c:69: warning: assignment discards qualifiers from pointer target type 
authorize.c:70: warning: assignment discards qualifiers from pointer target type 
authorize.c:71: warning: assignment discards qualifiers from pointer target type 
authorize.c:72: warning: assignment discards qualifiers from pointer target type 

Firsts, прессформ, улица и молнии объявлены как:

const char *firsts[] = { 
     "Asgar", 
     "Aadit", 
     "Aanand", 
     "Aaron" 
}; 

Что я делаю неправильно?

+4

Вы не указали определения для 'firsts',' lasts' и т. Д. По внешности ошибки они включают 'const', тогда как' x_first_name' нет. – sh1

+0

Как объявляются 'firsts',' lasts' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''? – Hasturkun

+0

Также ожидаем, что вас будет беспокоить использование 'rand()% k'. – sh1

ответ

3

Как указано в компиляторе, вы отбрасываете квалификатор (const в этом случае) из указателя при назначении.

Это происходит, когда вы назначаете char * значение const char *.

1

первых, длинных, улиц массива, поэтому операция firsts[rand() % firsts_count]; вернет значение, которое является const char * в вашем случае.

Но вы пытаетесь собрать эти значения в переменных x_first_name и x_last_name, которые являются char* (указатель на char). Также в задании он теряет свой характер const.

+0

Да, я понял, я буду использовать только «char *», я забыл, что я определил те массивы в своих заголовках как «const char *», я смотрел только в основном коде и упускают из виду файлы заголовков. – bsteo

Смежные вопросы