2015-10-08 3 views
-1

Я пытаюсь передать адрес strings_line_tokens в split_string. Я бы подумал, что мне понадобится «&» для адреса, тогда один из этих методов будет работать.передавая адрес массива строк функции

static void split_string(const char *buffer, size_t buflen, char ***strings_line_tokens) 
static void split_string(const char *buffer, size_t buflen, char **strings_line_tokens) 
static void split_string(const char *buffer, size_t buflen, char **strings_line_tokens[]) 
static void split_string(const char *buffer, size_t buflen, char ***strings_line_tokens[]) 

Это мое объявление и где я пытаюсь передать адрес функции.

char *strings_line_tokens[503] = {0}; 
split_string(line, strlen(line)+1, &strings_line_tokens); 

Я продолжаю получать некоторые изменения этой ошибки.

warning: passing argument 3 of ‘split_string’ from incompatible pointer type main.c:73: note: expected ‘char ***’ but argument is of type ‘char * (*)[503]’

Моя цель после того, как правильно передать переменную моей функции, это сделать это. И после этого я хочу иметь возможность использовать эти значения в основном.

strings_line_tokens[*big_boy_counter] = malloc(strlen(ptr[i])+1); 
strcpy(strings_line_tokens[*big_boy_counter], ptr[i]); 
+0

Можете ли вы правильно отформатировать код? –

+0

Хм, совершенно уверен, что это первый четырехзвездочный код, который я когда-либо видел. Ну, если быть трехзвездным программистом, это не комплимент, что бы это было для четырехзвездочного программиста? И обратите внимание, что нет «массива строк», но «массив указателей на' char' » – Olaf

+0

Итак, что вы ожидаете от вас, передаете указатель на массив, где ожидается указатель на ...? Массив не является указателем или наоборот. – Olaf

ответ

1

Если у вас есть

char *strings_line_tokens[503] = {0}; 

Тип &strings_line_tokens является char* (*)[503].
Когда вы используете string_line_tokens в вызове функции, он распадается на тип char**.

Если вы хотите использовать первую форму, вы должны объявить функцию, чтобы быть:

static void split_string(const char *buffer, 
         size_t buflen, 
         char* (*strings_line_tokens)[503]); 
split_string(line, strlen(line)+1, &strings_line_tokens); 
           // ^^^ Using the & operator. 

Если вы хотите использовать вторую форму, вы должны объявить функцию, чтобы быть :

static void split_string(const char *buffer, 
         size_t buflen, 
         char** strings_line_tokens); 

split_string(line, strlen(line)+1, strings_line_tokens); 
           //^Not using the & operator. 

Возьмите с собой.

+0

У него есть прототип функции, показанный в вопросе для второй формы, но он не работает. – clearlight

+0

У меня вопрос о втором. Мое понимание с указателями заключается в том, что если я не передаю адрес 'strings_line_tokens', тогда значения, которые были изменены в split_string, будут потеряны после того, как он покинет эту функцию. Main() не сможет увидеть, что изменилось. Это верно? Или это действительно расширенное использование указателей? – rockstar797

+0

@ rockstar797, это частично правильно.В 'split_string', если вы измените пункт' strings_line_tokens', то это изменение не будет видно в 'main'. Однако, если вы измените элементы 'strings_line_tokens', изменение будет видно в' main'. –

-1

Эти обе работают. Мне нужно будет узнать, как ваши функции будут знать больше о том, что использовать и что может быть лучше:

split_string(line, strlen(line)+1, (char ***)&strings_line_tokens); 


split_string(line, strlen(line)+1, (char **)strings_line_tokens); 
+0

'(char ***) & strings_line_tokens' неверно;' (char **) strings_line_tokens' является излишним. – immibis

+0

Опять же, это сводится к использованию. Я заставил их скомпилировать. – clearlight

+0

Не все, что компилируется, работает. – immibis

Смежные вопросы