为什么不能使用指针指向char指针而不是char指针数组?

时间:2012-06-06 11:26:45

标签: c pointers

当我尝试使用以下代码中的第二个选项来初始化names时,我遇到了分段错误。我猜第二个选项在概念上有些不正确。有什么想法吗?

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

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

4 个答案:

答案 0 :(得分:6)

是。在第一种情况下,您有一个指针数组。每个指针指向一个单独的项目(Alan,Frank ......)

第二个声明

char **names;

暗示名称是指向指针的指针[你不能像这样初始化一组字符串]。如在

char *str = "hello"
char **names = &str;

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:0)

它不会导致gcc的seg错误。然而,尝试使用整数数组进行相同的操作可能会说明为什么它没有多大意义:

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确实会发出警告。