使用双指针打印指针数组

时间:2013-11-24 06:01:48

标签: c arrays pointers

根据我在这个网站上发现的其他问题,我正在尝试使用**双指针打印一个指向字符(字符串)的指针数组,如下所示:

char *input=malloc(128), *color[7]={0}, **colors=malloc(8); 

fgets(input, 128, stdin);
sscanf(input, "%s%s%s%s%s%s", &color[0], &color[1], &color[2], &color[3], &color[4], &color[5]);
color[6]=NULL;  
colors=color;

while(*colors)
printf("%s ", colors++);

我从上面收到的输出似乎是将每个输入字符串窒息到4个字节然后溢出,如果它超过4个,因为如果我输入:“black red gold white green blue”,例如,我收到:“blacred red goldwhitgreeblue goldwhitgreeblue whitgreeblue greeblue blue。”很沮丧。

我尝试取消引用颜色++,就像我在其他示例中看到的那样,但这会导致程序崩溃。最终,printf仅用于调试。这是我正在尝试创建的char **(void)函数的一部分,用于分配我正在尝试打印到char **类型的局部变量。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

当你这样做时

char **colors = malloc(8);

您只为变量colors分配了8个字节。不足以存储六个字符串。如果你想要八个字符串,为什么不简单地创建一个包含八个字符串的数组?

char *colors[8] = { NULL };

上述声明将colors声明为指向char的八个指针的数组,所有指针都初始化为NULL

如果您迫切需要分配堆,那么您可以这样做。

char **colors = calloc(8, sizeof(char *));

我使用calloc来确保分配的内存是零初始化的(即所有指针都是NULL)。


此外,sscanf不会自动为其扫描的字符串分配空间,您必须手动执行此操作。最简单的可能是使用'm'修饰符来格式化代码,例如

sscanf(input, "%ms %ms %ms %ms %ms %ms",
       &color[0], &color[1], &color[2], &color[3], &color[4], &color[5]);