Как хранится массив строкового литерала в C?
Я думаю, вы ошибаетесь в том, что строковые литералы, на которые указывают указатели char
в массиве words[]
впоследствии сохраняются в памяти, что не соответствует действительности. В непрерывной памяти хранятся только указатели char
.
Кроме того, вы, похоже, смешиваете адреса памяти, такие как 0x764f73a1
, с размером объектов или массивов в байтах.
Таким образом, ваш первый for
l oop:
for(wp = *words; wp - *words < sizeof(words); wp += strlen(wp) + 1) {
printf("wp -> %s\n", wp);
}
вызывает неопределенное поведение и не имеет смысла.
1.
wp = *words
wp
получает назначение по адресу первого строкового литерала.
2.
wp - *words < sizeof(words)
Это условие не имеет смысла. Вы сравниваете размер массива указателя с символом words
с адресом, который указатель wp
хранит в качестве значения минус адрес первого строкового литерала.
3.
wp += strlen(wp) + 1
Это не работает, поскольку строковые литералы не должны храниться непрерывно в памяти.
В противоположность этому, второй for
l oop:
for(int i = 0; i < sizeof(words) / sizeof(char *); i++) {
printf("words[%d] -> %s\n", i,words[i]);
}
является правильным, поскольку он использует только указатели char
в массиве words
и выполняет итерацию столько раз, сколько указатели находятся в words
.