Я читал об общих подводных камнях C и пришел к этой статье на каком-то известном сайте Uni . (Это вторая ссылка, которая появляется в Google).
Последний пример на этой странице:
// Memory allocation on the stack
void b(char **p) {
char * str="print this string";
*p = str;
}
int main(void) {
char * s;
b(&s);
s[0]='j'; //crash, since the memory for str is allocated on the stack,
//and the call to b has already returned, the memory pointed to by str
//is no longer valid.
return 0;
}
Это объяснение в комментарии заставило меня задуматься: разве память для строковых литералов не статична?
Тогда разве нет настоящей ошибки в том, что вы не должны изменять строковые литералы, потому что это неопределенное поведение? Или комментарии там верны, и мое понимание этого примера неверно?
При дальнейшем поиске я увидел этот вопрос: ссылка на символ, который вышел из области действия , и из этого вопроса я понял, что следующий код является действительным.
#include <malloc.h>
char* a = NULL;
{
char* b = "stackoverflow";
a = b;
}
int main() {
puts(a);
}
Также этот вопрос согласен с другим вопросом о стековом потоке и моим мнением, но не согласен с комментарием из кода этого сайта.
Чтобы проверить это, я попробовал следующее,
#include <stdio.h>
#include <malloc.h>
void b(char **p)
{
char * str = "print this string";
*p = str;
}
int main(void)
{
char * s;
b(&s);
// s[0]='j'; //crash, since the memory for str is allocated on the stack,
//and the call to b has already returned, the memory pointed to by str is no longer valid.
printf("%s \n", s);
return 0;
}
, который, как и ожидалось, не дает ошибки сегментации.