8

当我尝试以下代码中的第二个选项进行初始化names时,我得到一个分段错误。我猜第二个选项在概念上有些不正确。有任何想法吗?

 char *names[] = {
            "Alan", "Frank",
            "Mary", "John", "Lisa"
        };

 char **names = {
            "Alan", "Frank",
            "Mary", "John", "Lisa"
        };
4

4 回答 4

6

是的。在第一种情况下,您有一个指针数组。每个指针指向一个单独的项目(艾伦,弗兰克...)

第二次声明

char **names;

意味着名称是指向指针的指针[您不能像这样初始化一组字符串]。如在

char *str = "hello"
char **names = &str;
于 2012-06-06T11:32:06.467 回答
2

在第一种情况下,您有一个char*. 这意味着,您已经为 5 个 char* 变量(数组的条目)分配了内存,一个接一个地整齐地坐在内存中。此外,它们中的每一个都被初始化为每个字符串的开头。

在第二种情况下,您有一个 char** 类型的指针。您只有足够的内存用于一个指针。

(我已经跳过讨论为每个字符串分配的内存。在这两种情况下可能相同,但在这里无关紧要)

于 2012-06-06T11:42:43.940 回答
2

它具有完全不同的内存布局。

你的第一个例子是一个指针数组。它占据 5 倍的大小char *

char *但是,您的第二个示例是指向预期一个或多个位置的指针。无法按照您的方式对其进行初始化。

于 2012-06-06T11:32:40.340 回答
0

它不会导致 gcc 出现段错误。然而,用整数数组尝试同样的 this 可能会说明为什么它没有多大意义:

char* names[] = { "Dennis", "Richie" };
char** more_names = { "Sarah", "O'connor" };

printf("Name: %s %s\n", names[0], names[1] );
printf("Name: %s %s\n", more_names + 0, more_names + 1);

int numbers[] = { 0, 1 };
int x = 2, y = 3;
int* more_numbers = { &x, &y };

printf("Numbers: %d, %d\n", numbers[0], numbers[1] );
printf("Numbers: %d, %d\n", *(more_numbers + 0), *(more_numbers + 1));

奇怪的是,这个例子实际上为整数数组产生了预期的结果。但是 gcc 确实会产生警告。

于 2012-06-06T12:01:18.300 回答