我练习了一个没有初始值的字符串数组.
#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)
它工作正常.
我以为我可以在主函数中移动数组指针.
#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)
嗯,为什么不工作?它导致"分段错误",输出难看.有人可以解释为什么我不应该这样做吗?
您分配一个零元素的数组,然后添加两个指向它的指针.这会写入数组外部并导致缓冲区溢出.
顺便提一下,如果数组是全局分配的,它会覆盖未使用的内存,但是当它在main()中分配时会覆盖堆栈.