2013-11-24 66 views
0

继查询等我在此网站上发现,我想打印指针数组字符(串),通过使用**双指针如下:打印指针数组使用双指针

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个字节,然后溢出,如果它超过四个,因为如果我键入:“黑色红色金白色绿色蓝色”,例如,我收到:“bla red gold gold whit whit。。。。”“”“”。“非常令人沮丧。

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

+0

'的malloc()'是不是魔术... – 2013-11-24 07:16:25

+0

好,冬暖夏凉。并不是我曾经想过的。 – mosdellg

+0

那么,你用它就好像是这样,所以... – 2013-11-24 07:28:45

回答

2

当你

char **colors = malloc(8); 

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

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]); 
+0

谢谢。我使用双指针的唯一原因是我可以在函数中返回它。据我所知,我无法返回一个数组,对吗?这是我的困境。我确实尝试将更多内存分配给**颜色,但仍然执行相同的操作。我分配这么低的金额的原因是因为我认为我只需要少量地址,每个* color []元素都需要一个地址。 – mosdellg

+0

@mosdellg然后用'calloc'调用回答我的问题。而且你无法从函数返回一个指向本地数组的指针是正确的。请记住提供给'malloc'的大小是*字节数*,并且指针通常是四个(在32位平台上)或八个(在64位平台上)字节。 –