Распределение данных по указателям в C - PullRequest
1 голос
/ 03 августа 2010
char *p = "abc"; 
char *q = "abc"; 

if (p == q) 
printf ("equal"); 
else 
printf ("not equal"); 

Выход: равное

Это специфично для компилятора или определено где-то в стандартах как ожидаемое поведение.

Ответы [ 4 ]

6 голосов
/ 03 августа 2010

Компилятору разрешено объединять строковые литералы, но это не обязательно.

От 6.4.5 / 6 Строковые литералы:

Не определено, различаются ли эти массивы при условии, что их элементы имеют соответствующие значения.

Фактически, компилятор может объединить следующий набор литералов:

char* p = "abcdef";
char* q = "def";

такой, что q может указывать «внутри» строки, на которую указывает p (то есть, q == &p[3]).

1 голос
/ 03 августа 2010

Речь идет не о каком-то «распределении данных по указателям».Речь идет о том, гарантированно ли каждый экземпляр строкового литерала является отдельным / отличным объектом массива в C. Ответ - нет, они не гарантированно будут разными.Поведение в этом случае зависит от реализации.В вашем примере вы можете получить идентичные указатели или разные указатели.

1 голос
/ 03 августа 2010

Если вы сравниваете строки, не следует ли использовать strcmp?

0 голосов
/ 03 августа 2010

Не полагайтесь на это. Это зависит от omptimization компилятора, чтобы уменьшить размер двоичного файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...