2013-01-18 49 views
1

这似乎是一个非常简单的问题,但我无法弄清楚哪个部分导致了它。基本上,我有只包含字符串C - 将信息传递给一个结构体(特别是一串字符串)

struct command_stream{ 
    char **tokens; 
}; 

typedef struct command_stream *command_stream_t; 
command_stream_t test; 

阵列再后来就一个结构,我解析某些字符串为较短的,用字符串的另一个数组结束

char **words = *array of strings* 

字包含正确的我想要的信息,我打开并打印出每个元素,以确保我没有收到错误的字符串。所以现在我只需要将单词指向单词

test->tokens = words; 

但它给了我一个段错误。我不知道为什么。他们都是指针,所以除非我错过了一些明显的...

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

typedef struct command_stream command_stream_s; 
command_stream_s new_command_stream; 

,就回到 & new_command_stream; 这应该是正确的?尽管new_command_stream本身不是指针。

+1

发布完整的代码,足以重现问题。 –

回答

2

从你的代码摘录,似乎你还没有声明的结构。你已经成功地声明了一个指向struct command_stream_t test;的指针,但是这个指针还没有指向任何地方。

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

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

这样你就可以成功地使用:

test->tokens = words; 

,你打算。

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

+0

是的。在为该变量赋值之前,您不能使用变量的值。 'test-> tokens'使用'test'的值,但没有'test = ;'任何地方都可以找到。 –

+1

@DavidSchwartz确实如此。这是我不愿意在typedef中“隐藏”指针的原因之一。看到像'command_stream_t foo'这样的东西可能会促使我相信'foo'是一个完整的变种,当它不是时。 –

+0

哦,哎呀。这是一个更大的任务的一部分,我一直忘记他们需要我们返回一个指针,这就是为什么它是这样设置的。所以如果我像typedef struct command_stream command_stream_s(它不是​​一个指针)并且刚刚返回&new_command_stream那么它应该可以工作。 – user1777900

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不再是指针类型,而是实际的结构。

相关问题