Передайте по ссылке массив указателей в c - PullRequest
0 голосов
/ 28 августа 2018

Я думаю, что неверно передал мой массив по ссылке, потому что у меня есть много предупреждений для него. Не могли бы вы помочь мне?

void func (char **array[], char b){
*array[0]=&b;
}

int main () {

char *array_in_main[SIZE];
char b_in_main='b';
func (*array_in_main, b_in_main);
return 0;

}

Да, я знаю. Это бессмысленный пример, но я сомневаюсь в синтаксисе. Проверьте это, пожалуйста!

Ответы [ 4 ]

0 голосов
/ 28 августа 2018

Вам необходимо понять механизм передачи array функции в языке программирования Си. Когда вы передаете массив функции в C, указатель (адрес) на первый элемент массива передается функции, и, поскольку у вас есть ссылка на него, вы можете изменить содержимое массива в функции (но вы можете не меняйте место в памяти, на которое указывает массив). Я рекомендую взглянуть на этот вопрос .

Программа ниже имеет две функции. Функция rightFunc - это простой и правильный подход к достижению того, что вы пытались сделать. Тем не менее, я предоставил func, который показывает способ передачи указателя (или ссылки) на массив указателей.

#include <stdio.h>

#define SIZE 100

void rightFunc(char *array[], char *b)
{
    array[0] = b;
}

void func(char *(*array)[], char *b)
{
    (*array)[0] = b;
}

int main(int argc, char *argv[]) 
{
    char *array_in_main[SIZE];
    char b_in_main = 'b';

    func(&array_in_main, &b_in_main);
    printf("Character is %c\r\n", *array_in_main[0]);

    b_in_main = 'c';
    rightFunc(array_in_main, &b_in_main);
    printf("Character is %c\r\n", *array_in_main[0]);
    return 0;
}

Я хотел бы указать на одну ошибку в вашей программе. Вы можете получить адрес локальной переменной (automatic storage class), но этот адрес не будет действительным вне функции (после выхода из функции). Чтобы исправить проблему в вашей программе, я изменил функции так, чтобы в вашей программе было pointer to char.

0 голосов
/ 28 августа 2018

У вас проблемы с просмотром.

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

Во-вторых, вы пытаетесь использовать адрес b, который является локальной переменной, и его область действия заканчивается функцией func, вы не можете использовать его снаружи.

Этот код будет работать:

#include <stdio.h>
#define SIZE 10

void func (char *array[], char *b)
{
    array[0]=b;
}

int main () 
{
    char *array_in_main[SIZE];
    char b_in_main='b';
    func (array_in_main, &b_in_main);

    return 0;
}
0 голосов
/ 28 августа 2018

Это, вероятно, ближе к тому, что вы пытаетесь сделать, нет?

Помимо проблем компиляции (уже объясненных в ответе Тау и в ответе Осириса ), стоит отметить, что массивы уже сами по себе являются указателями.

Просто объявите в основном char array_in_main[SIZE]. После этого вы можете просто указать char array[] в качестве аргумента и передать array_in_main напрямую. В функцию передается адрес первой позиции в массиве &(array_in_main[0]), поэтому массив можно эффективно обновить из функции.

код:

#define SIZE 10

void func(char array[], char b) {
  array[0] = b;
}

int main () {
  char array_in_main[SIZE];
  char b_in_main='x';
  func(array_in_main, b_in_main);
  return 0;
}
0 голосов
/ 28 августа 2018

Массивы в C разбиты на указатели на первый элемент при использовании в качестве параметра.

Просто передайте сам массив. Указатель на него не нужен.

Также, как сказал Осирис , вы не можете использовать адрес локальной переменной вне ее области действия.

void func (char *array[], char b){  /* Changed &b to b */
    array[0][0]=b; /* Changed array[0] to array[0][0], assuming that array is a 2D array */
}
int main () {
    char *array_in_main[SIZE];
    char b_in_main='b';
    func (array_in_main, b_in_main); /* Changed *array_in_main to array_in_main */
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...