【问题标题】:Printing an array of pointers using double pointer使用双指针打印指针数组
【发布时间】:2013-11-24 06:01:47
【问题描述】:

根据我在此站点上找到的其他查询,我正在尝试通过使用 **double 指针来打印指向字符(字符串)的指针数组,如下所示:

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 个字节就会溢出,因为如果我输入:“黑色红色金色白色绿色蓝色”,例如,我收到:“黑色红色金色whitgreeblue goldwhitgreeblue whitgreeblue greeblue blue。”非常令人沮丧。

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

【问题讨论】:

  • malloc() 不是魔法...
  • 好的,很酷。没想到是这样的。
  • 嗯,你使用它的时候就好像它是一样的,所以......
  • 我用它来分配内存。顺便说一句,我的问题的哪一部分不清楚或没有显示出任何研究工作?在过去的三个小时里,我一直在这个网站和其他网站上寻找类似的问题。如果那确实是你,我不欣赏势利的反对票,仅仅因为是一个 3 个月大的 C 程序员。

标签: c arrays pointers


【解决方案1】:

当你这样做时

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

【讨论】:

  • 谢谢。我使用双指针的唯一原因是我可以在函数中返回它。据我了解,我不能返回一个数组,对吗?这是我的困境。我确实尝试为 **colors 分配更多内存,但仍然做同样的事情。我分配这么少数量的原因是因为我认为我只需要几个地址,一个用于 *color[] 的每个元素。
  • @mosdellg 然后在calloc 电话的答案中查看我的线路。不能从函数返回指向本地数组的指针是正确的。请记住,提供给malloc 的大小是字节 的数量,并且指针通常是四个(在 32 位平台上)或八个(在 64 位平台上)字节。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多