为什么我在没有指定长度的情况下声明一个字符串数组,它仍然可以工作?无论是否有动态分配

问题描述 投票:0回答:1
#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

如果我只分配了两个字节,怎么可能包含这么长的字符串?

c arrays string malloc calloc
1个回答
0
投票

这两段代码都是无效的。

在第一种情况下,元素的数量为 mystring 是由它的初始化器决定的。 因为你用 { 0 } 数组的大小是1个元素。 阵列中的 scanf 然后在数组边界的末端调用 未定义行为 在这种情况下,会导致程序崩溃。

在第二种情况下,你为一个2个元素的数组分配了空间,并且...。scanf 再次写过分配的内存的末端。 这也会调用未定义的行为,但在这种情况下,程序似乎可以正常工作。

只是因为程序 可以 崩盘不代表 .

© www.soinside.com 2019 - 2024. All rights reserved.