C Появляется сообщение о несовместимом типе указателя, в котором перечислены идентичные типы указателей для ожидаемого и действительного - PullRequest
3 голосов
/ 15 марта 2019

Я пытаюсь написать код для динамического выделения памяти для массива структур.Я хочу передать указатель, связанный с пространством динамической памяти, в другую функцию для дальнейшего использования.Следующий пример кода является грубым примером того, что я хочу сделать (сокращенно для краткости):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/sha.h>
#include <time.h>

struct password_struct;
void create_password(char password_seeds[], struct password_struct* user_passwords);

void main() {


    char password_seeds[100];
    int num_passwords = 5;
    struct password_struct {
        char password[17];
        char hash[65];
        int entropy;
    };


    struct password_struct *user_passwords = malloc(num_passwords * sizeof(struct password_struct));

    create_password(password_seeds, user_passwords);
    free(user_passwords);
}


void create_password(char password_seeds[], struct password_struct* user_passwords){

}

Когда я пытаюсь скомпилировать это, я получаю следующую ошибку:

In function ‘main’:
     c:24:5: warning: passing argument 2 of ‘create_password’ from incompatible pointer type [enabled by default]
     create_password(password_seeds, user_passwords);
     ^
     c:8:6: note: expected ‘struct password_struct *’ but argument is of type ‘struct password_struct *’
     void create_password(char password_seeds[], struct password_struct* user_passwords);
          ^

Появится список одинаковых типов указателей для фактического и ожидаемого типов указателей.Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

5 голосов
/ 15 марта 2019

Это связано с тем, что определение структуры password_struct внутри main() и невидимо вне области действия.

Перемещение определения структуры в область действия файла (за пределами main() или любая другая функция)).

Тем не менее, посмотрите на это: Каковы действительные подписи для функции main () C?

1 голос
/ 16 марта 2019

У вас есть два разных типа struct password_struct - один определен в глобальной области видимости, а второй - как локальный по отношению к основному. Несмотря на то, что они имеют одно и то же имя, они заканчивают тем, что были двумя несвязанными типами, потому что находились в различных областях. Функция объявлена ​​как принимающая указатель на глобальный, но внутри main вы используете указатель на локальный.

0 голосов
/ 15 марта 2019

struct password_struct *user_passwords = malloc(num_passwords * sizeof(struct password_struct));

Здесь вы создаете память для password_struct. Функция malloc возвращает общий указатель, поэтому важно преобразовать тип, чтобы вы могли преобразовать общий указатель в password_Struct. Так что попробуйте это

struct password_struct *user_passwords = (struct password_struct*)malloc(num_passwords * sizeof(struct password_struct));

Эта строка может решить вашу проблему.

...