2013-03-17 6 views
2

При написании следующего кода я должен получить сообщение об ошибке. Размер массива задан как ноль (который, я полагаю, является незаконным), и, кроме того, 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 (ожидается). Может ли кто-нибудь объяснить внутреннюю работу?

+0

Может быть полезно - http://stackoverflow.com/questions/14565778/c-how-protect-dynamic-char-before-overwritte-by-second-dynamic-char –

+0

при запуске 'sprintf (char * string , const char *, ...) 'указатель на конец' string' всегда определяется как '(char *) - 1' или используется' vsnprintf (buf, SIZE_MAX, format, arg); 'по-видимому, они не являются безопасными. – yuan

+0

Скорее всего, вы переписываете выделенную память в стек, поэтому вы не получаете segfault. Если он перезаписывает данные, которые не нужны, может показаться, что все в порядке. – teppic

ответ

4

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