C 动态内存分配与sprintf
在编写以下代码时,我应该会遇到一个错误。数组大小被指定为零,我认为这是非法的,而且sprintf正在将abc打印到一个没有分配任何内存但我得到的输出是abc。我不明白为什么C 动态内存分配与sprintf,c,C,在编写以下代码时,我应该会遇到一个错误。数组大小被指定为零,我认为这是非法的,而且sprintf正在将abc打印到一个没有分配任何内存但我得到的输出是abc。我不明白为什么 #include<stdio.h> #include<string.h> int main() { char a[0]; sprintf(a,"%s","abc"); printf("%s\n",a); return 0; } 当我将数组大小设置为1,2,3时
#include<stdio.h>
#include<string.h>
int main()
{
char a[0];
sprintf(a,"%s","abc");
printf("%s\n",a);
return 0;
}
当我将数组大小设置为1,2,3时,我得到的是正确的输出,而当它为显式使用a作为指针(即使用预期的char*a)设置分段错误时,情况就不应该是这样了。有人能解释一下内部工作吗?没有,没有合理的解释。通过使用小于要打印的字符串的数组,程序调用未定义的行为。这意味着任何事情都可能发生,包括一切似乎都运转良好的事实。未定义的行为并不意味着程序必须崩溃,它意味着它可以崩溃。不,没有合理的解释。通过使用小于要打印的字符串的数组,程序调用未定义的行为。这意味着任何事情都可能发生,包括一切似乎都运转良好的事实。未定义的行为并不意味着程序必须崩溃,它意味着程序可能会崩溃。这可能会有帮助-在运行sprintfchar*字符串、const char*、,。。。指向字符串结尾的指针始终定义为char*-1,或使用vsnprintfbuf、SIZE_MAX、format、arg;显然,它们是不安全的。您很可能正在覆盖堆栈中分配的内存,这就是为什么没有SEGFULT。如果它覆盖了不需要的数据,看起来一切正常。这可能会有帮助-在运行sprintfchar*字符串、const char*、,。。。指向字符串结尾的指针始终定义为char*-1,或使用vsnprintfbuf、SIZE_MAX、format、arg;显然,它们是不安全的。您很可能正在覆盖堆栈中分配的内存,这就是为什么没有SEGFULT。如果它覆盖了不需要的数据,看起来一切正常。