根据我在这个网站上发现的其他问题,我正在尝试使用**双指针打印一个指向字符(字符串)的指针数组,如下所示:
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 **类型的局部变量。我该如何解决这个问题?
答案 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]);