#include <stdio.h>
int main(){
char mystring[] = {0};
scanf("%[^\n]s", mystring);
printf("%s\n%d\n", mystring, strlen(mystring));
}
输出。
$ ./"dyn_mem"
pffwemfmwefefkfnefkfkwfkfkwfkwfkfkwkfkfpwefkpfwfkffnefkfekfefkefekfekwfkefekfmekfmkfmefmew
pffwemfmwefefkfnefkfkwfkfkwfkwfkfkwkfkfpwefkpfwfkffnefkfekfefkefekfekwfkefekfmekfmkfmefmew
90
Segmentation fault: 11
这就是 Segmentation fault: 11
却是 莫名其妙 能够打印出很长的字符串。这怎么可能呢?什么是 char mystring[] = {0};
做什么?它是否有类似动态分配字符串的功能?我无法解释为什么会这样。
另外,如果我用 商场 或 呼叫它的工作没有任何错误。
#include <stdio.h>
int main(){
char *mystring = calloc(2, sizeof(char));
scanf("%10[^\n]s", mystring);
printf("\nValue: %s\nAvailable space: %d\nAllocated space: %d\n", mystring, 2*sizeof(char), sizeof(char)*strlen(mystring));
free(mystring);
}
输出。
$ ./"dyn_mem"
laaaaaaaaaaa
Value: laaaaaaaaa
Available space: 2
Allocated space: 10
如果我只分配了两个字节,怎么可能包含这么长的字符串?
这两段代码都是无效的。
在第一种情况下,元素的数量为 mystring
是由它的初始化器决定的。 因为你用 { 0 }
数组的大小是1个元素。 阵列中的 scanf
然后在数组边界的末端调用 未定义行为 在这种情况下,会导致程序崩溃。
在第二种情况下,你为一个2个元素的数组分配了空间,并且...。scanf
再次写过分配的内存的末端。 这也会调用未定义的行为,但在这种情况下,程序似乎可以正常工作。
只是因为程序 可以 崩盘不代表 会.