C не выделяет память для нового массива символов - PullRequest
1 голос
/ 01 июля 2019

Я не вижу, как работает следующий код при перезаписи массива char cd2.Я пытаюсь просто выделить место для двух строк, а затем заполнить их результатами функции crypt.Я не уверен, насколько большую роль здесь играет crypt или это какая-то другая функция манипуляции со строками.Но приведенный ниже вывод не должен быть одинаковым, они должны иметь разные значения.Но они оба "ttxtRM6GAOLtI", и я пытался получить один вывод, чтобы начать с "ss" .

#include <crypt.h>
#include <unistd.h>
#include <pwd.h>
#include <string.h>
#include <stdio.h>

int main(int argc, string argv[])
{
    char *cd;  
    cd = malloc(30 * sizeof(*cd));
    char *cd2; 
    cd2 = malloc(30 * sizeof(*cd2));

    cd2 = crypt("yum", "ss");
    cd = crypt("yum", "tt");

    printf("hasehd 'yum' with 'tt' salt is %s\n",cd);
    printf("hasehd 'yum' with 'ss' salt is %s\n",cd2);

}

output -

   hasehd 'yum' with 'tt' salt is ttxtRM6GAOLtI
   hasehd 'yum' with 'ss' salt is ttxtRM6GAOLtI

ОБНОВЛЕНИЕ: Я изменил его, чтобы не использовать malloc, но я думаю, что я должен все еще распределять память через объявление массива char.* * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * * * * * * * strcpy * * * * * * * * *

* *1018* * * * * *.рекомендовал, и я использовал malloc, чтобы выделить место для массива.strcpy кажется немного чище, потому что мне не нужно указывать длину.
#include <crypt.h>
#include <unistd.h>
#include <pwd.h>
#include <string.h>
#include <stdio.h>

int main(int argc, string argv[])
{
  int PWORD_LENGTH = 30;

   char *cd;
   char *cd2;
   cd = malloc(sizeof(char) * (PWORD_LENGTH + 1));
   cd2 = malloc(sizeof(char) * (PWORD_LENGTH + 1));

   strcpy(cd2, crypt("yum", "ss"));
   strcpy(cd, crypt("yum", "tt"));

   printf("hasehd 'yum' with 'tt' salt is %s\n",cd);
   printf("hasehd 'yum' with 'ss' salt is %s\n",cd2);

}

выход -

hasehd 'yum' with 'tt' salt is ttxtRM6GAOL
hasehd 'yum' with 'ss' salt is ssqDHVWOCwe

Ответы [ 2 ]

1 голос
/ 01 июля 2019

crypt() функция имеет внутреннюю память, каждый вызов перезаписывает предыдущий результат.

Либо вызовите crypt() и printf() для 'ss', затем для 'tt'

Или используйте реентерабельную версию

#define _GNU_SOURCE 1
#include <crypt.h>
#include <unistd.h>
#include <pwd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    char *cd;
    cd = malloc(30 * sizeof(*cd));
    char *cd2;
    cd2 = malloc(30 * sizeof(*cd2));

    struct crypt_data *data = calloc(1, sizeof (struct crypt_data));
    struct crypt_data *data2 = calloc(1, sizeof (struct crypt_data));

    cd2 = crypt_r("yum", "ss", data2);
    cd = crypt_r("yum", "tt", data);

    printf("hasehd 'yum' with 'ss' salt is %s\n",cd2);
    printf("hasehd 'yum' with 'tt' salt is %s\n",cd);

}
1 голос
/ 01 июля 2019

crypt() возвращает указатель на статически выделенный буфер.Каждый вызов crypt() перезаписывает предыдущий результат.

http://man7.org/linux/man-pages/man3/crypt.3.html

Возвращаемое значение указывает на статические данные, содержимое которых перезаписывается при каждом вызове.

Ваши malloc звонки в этом случае не нужны.Фактически, вы получаете недостижимую память, которую теперь не можете free, потому что вы перезаписали указатели с результатом crypt()

...