C - 字符串数组范围的差异

all*_*kim 1 c

我练习了一个没有初始值的字符串数组.

尝试1

#include <stdio.h>

char *array[] = {};
int main(int argc, char *argv[]) {
    array[0]="Hello";
    array[1]="World";

    char **i = array;
    while (*i) {
        printf("%d %s\n", i, *i);
        i++;
    }
}
Run Code Online (Sandbox Code Playgroud)

$ gcc array_of_strings.c && ./a.out

6293704 Hello
6293712 World
Run Code Online (Sandbox Code Playgroud)

它工作正常.

尝试2

我以为我可以在主函数中移动数组指针.

#include <stdio.h>

int main(int argc, char *argv[]) {
    char *array[] = {};
    array[0]="Hello";
    array[1]="World";

    char **i = array;
    while (*i) {
        printf("%d %s\n", i, *i);
        i++;
    }
}
Run Code Online (Sandbox Code Playgroud)

$ gcc array_of_strings.c && ./a.out

-1899140568 (j??
-1899140560 World
-1899140552 ???%Y
-1899140544 1?I??^H??H???PTI???@
-1899140536 d???
Segmentation fault
Run Code Online (Sandbox Code Playgroud)

嗯,为什么不工作?它导致"分段错误",输出难看.有人可以解释为什么我不应该这样做吗?

Sjo*_*erd 8

您分配一个零元素的数组,然后添加两个指向它的指针.这会写入数组外部并导致缓冲区溢出.

顺便提一下,如果数组是全局分配的,它会覆盖未使用的内存,但是当它在main()中分配时会覆盖堆栈.