Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 动态内存分配与sprintf_C - Fatal编程技术网

C 动态内存分配与sprintf

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时

在编写以下代码时,我应该会遇到一个错误。数组大小被指定为零,我认为这是非法的,而且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时,我得到的是正确的输出,而当它为显式使用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。如果它覆盖了不需要的数据,看起来一切正常。