При написании следующего кода я должен получить сообщение об ошибке. Размер массива задан как ноль (который, я полагаю, является незаконным), и, кроме того, sprintf печатает «abc» для a, которому не была выделена какая-либо память, но я получаю вывод как «abc». Я не могу понять, почему?динамическое распределение памяти и sprintf
#include<stdio.h>
#include<string.h>
int main()
{
char a[0];
sprintf(a,"%s","abc");
printf("%s\n",a);
return 0;
}
Я получаю правильный вывод, когда я даю размер массива будет 1,2,3, которые не должны быть в случае, когда она дает ошибку сегментации для явного использования в качестве указателя, то есть, используя char * a (ожидается). Может ли кто-нибудь объяснить внутреннюю работу?
Может быть полезно - http://stackoverflow.com/questions/14565778/c-how-protect-dynamic-char-before-overwritte-by-second-dynamic-char –
при запуске 'sprintf (char * string , const char *, ...) 'указатель на конец' string' всегда определяется как '(char *) - 1' или используется' vsnprintf (buf, SIZE_MAX, format, arg); 'по-видимому, они не являются безопасными. – yuan
Скорее всего, вы переписываете выделенную память в стек, поэтому вы не получаете segfault. Если он перезаписывает данные, которые не нужны, может показаться, что все в порядке. – teppic