2011-06-09 85 views
5

环环相扣的问题是Segmentation fault while using strcpy()?初始化一个指向结构

我有一个结构:

struct thread_data{  
    char *incall[10]; 
    int syscall arg_no;  
    int client_socket; 
}; 

如何初始化一个指针类型的上述结构以及初始化的指针结构内有10个字符串(incall [])。

我首先初始化字符串,然后是结构。

谢谢。

编辑:我想我用错了词,应该说分配。实际上,我将这个结构作为参数传递给线程。线程数不固定,作为参数发送的数据结构对于每个线程必须是唯一的,并且“线程安全”即不能被其他线程改变。

+3

这些是十个指向字符串的指针,而不是指向10个字符串的指针。它看起来像你在自己前面得到一些... – Potatoswatter 2011-06-09 17:38:42

+0

初始化或分配? – 2011-06-09 18:23:21

回答

10

这里的问题的答案我认为你问:

现在

您可以指定字符串td->incall像这样:

strcpy(td->incall[0], "First string"); 
strcpy(td->incall[1], "Second string"); 

理想情况下,你想在移动到下一个事情之前,检查每个malloc的结果,以确保它是成功的。

+0

已编辑。我可能以不正确的方式使用了“初始化”一词。应该像你说的那样“分配” – 2011-06-10 05:41:36

1

这取决于你需要你的变量是临时的或不:

struct thread_data data; // allocated on the stack 
// initialize your data.* field by field. 

struct thread_data* data = malloc(sizeof (struct thread_data)); // allocated on the heap 
// initialize your data->* field by field. 

在这两种情况下,你必须先分配你的结构,以便能够访问它的字段。

1

你可以写的东西就像这样:

#define ARRAY_DIMENSION(a) (sizeof(a)/sizeof((a)[0])) 

void init_func(void) 
{ 
    struct thread_data arg_to_thread; 
    int i; 
    char buffer[100]; 

    buffer[0] = '\0'; 

    for (i = 0; i < ARRAY_DIMENSION(arg_to_thread.incall); i ++) 
    { 
     /* Do something to properly fill in 'buffer' */ 

     arg_to_thread.incall[i] = strdup(buffer); 
    } 
} 
1

我觉得 malloc(sizeof(struct thread_data)); 应该工作,不是吗?

+1

这种情况下,您可能更喜欢使用'calloc'来获取零初始化行为,因为它将指针安全地设置为NULL。如果您可以使零值系统呼叫号码和sokcket安全以及更安全,它可以提供更多帮助。 – dmckee 2011-06-09 17:42:13

1

这是另一种可能性。我不清楚你想要什么值初始化,所以这只是一个数字,这几乎肯定是错误的。

struct thread_data *td; 
int i; 
// allocate memory for the structure 
td = malloc(sizeof(struct thread_data)); 
// then allocate/initialize the char* pointers. It isn't clear 
// what you want in them ... pointers to existing data? Pre-allocated 
// buffer? This just allocates a fixed size buffer, 
for (i = 0; i < sizeof(td->incall)/sizeof(td->incall[0]); i++) 
    td->incall[i] = malloc(42); 
4

相应struct初始化器可以是这样的:

struct thread_data a = { 
    .incall = {"a", "b", "c", "d", "e"}, 
    .arg_no = 5, 
    .client_socket = 3 
}; 

然后你就可以在这个地址赋给一个指针:

struct thread_data *b = &a; 
+3

如果这是在函数内部完成的,一旦函数返回,'* b'会结束指向堆栈上的某个位置? – TheMeaningfulEngineer 2015-03-26 12:50:14

+1

是的,但程序员一直都有责任确保一旦函数退出,指针就不会从堆栈帧指向内存。 – 2015-03-26 12:55:21