1

这似乎是一个非常简单的问题,但我无法弄清楚是哪个部分导致了它。基本上,我有一个结构,它只包含一个字符串数组

struct command_stream{
  char **tokens;
 };

typedef struct command_stream *command_stream_t;
command_stream_t test;

稍后,我将一些字符串解析为较短的字符串,最后得到另一个字符串数组

char **words = *array of strings*

words 包含我想要的正确信息,我循环并打印出每个元素以确保我没有得到错误的字符串。所以现在我只是将标记指向单词

test->tokens = words;

但它给了我一个分段错误。我不确定为什么。它们都是指针,所以除非我遗漏了一些明显的东西......

编辑:作为一个整体的函数必须返回一个指针,这就是为什么它是这样设置的,我一直忘记。但我想我已经明白了,如果我只是创建一个新的 typedef

typedef struct command_stream command_stream_s;
command_stream_s new_command_stream;

并返回 &new_command_stream; 那应该有效吗?即使 new_command_stream 本身不是指针。

4

2 回答 2

2

从您的代码摘录中,您似乎尚未声明该结构。您已成功声明了一个指向该结构的指针,command_stream_t test;但该指针尚未指向任何地方。

您需要以某种方式为您的结构分配内存并test引用它。例如:

    command_stream_t test = 
        (command_stream_t) malloc(sizeof(struct command_stream));

这样您就可以成功使用:

    test->tokens = words;

如您所愿。

请注意,您不需要使用malloc来分配内存。指针可以引用局部/全局变量,只要它具有与之关联的内存(注意,如果您使用局部变量,请不要在该变量的声明范围之外使用指针)。

于 2013-01-18T08:27:45.440 回答
1
typedef struct command_stream *command_stream_t;
command_stream_t test;

这使得“测试”成为一个指针。没有为结构分配内存。您需要为结构分配内存并使测试指针指向内存块,然后才能取消引用:

test->tokens = words;

做这个:

typedef struct command_stream command_stream_t;
command_stream_t test;

test.tokens = words;

不同之处在于,command_stream_t 不再是指针类型,而是实际结构。

于 2013-01-18T08:35:36.560 回答