C不是为新的char数组分配内存



我看不到以下代码如何工作W.R.T.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 %sn",cd);
    printf("hasehd 'yum' with 'ss' salt is %sn",cd2);
}

输出 -

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

更新:我将其更改为不使用Malloc,但我认为我必须通过声明字符数组分配内存。由于 crypt覆盖了一个静态缓冲区,因此我需要在覆盖其之前将结果给出其他地方。

#include <crypt.h>
#include <unistd.h>
#include <pwd.h>
#include <string.h>
#include <stdio.h>
int main(int argc, string argv[])
{
 char ch1[30];
 char ch2[30];
 char *cd;
 char *cd2;
 cd = &ch1[0];  
 cd2 = &ch2[0]; 
 snprintf(cd2, 12, "%sn", crypt("yum", "ss"));
 snprintf(cd, 12, "%sn", crypt("yum", "tt"));
 printf("hasehd 'yum' with 'tt' salt is %sn",cd);
 printf("hasehd 'yum' with 'ss' salt is %sn",cd2);
}

输出 -

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

更新:我按照建议使用strcpy,并使用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 %sn",cd);
   printf("hasehd 'yum' with 'ss' salt is %sn",cd2);
}

输出 -

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

crypt()将指针返回到静态分配的缓冲区。每个呼叫crypt()覆盖先前的结果。

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

返回值点指向静态数据,其内容被其内容覆盖 每个电话。

在这种情况下,您的malloc呼叫不需要。实际上,您最终获得了无法访问的内存,现在无法free,因为您以crypt()

的结果覆盖了指针

crypt()功能具有内部内存,每个调用覆盖以前的结果。

请致电crypt()printf(),然后为'ss'进行'tt'

或使用recotrant版本

#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 %sn",cd2);
    printf("hasehd 'yum' with 'tt' salt is %sn",cd);
}

相关内容

  • 没有找到相关文章

最新更新