我看不出下面的代码是如何工作的w.r.t.char数组cd2被覆盖了。我试图为两个字符串分配空间,然后用crypt函数的结果填充它们。我不确定crypt在这里扮演的角色有多大,也不确定这是否是其他字符串操作函数。但是下面的输出不应该相同,它们应该有不同的值。但它们都是“ttxtrm6gaulti”,我试图从“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);

}

输出-
   hasehd 'yum' with 'tt' salt is ttxtRM6GAOLtI
   hasehd 'yum' with 'ss' salt is ttxtRM6GAOLtI

更新:我把它改为不使用malloc,但我认为我必须通过一个char数组声明来分配内存。因为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, "%s\n", crypt("yum", "ss"));
 snprintf(cd, 12, "%s\n", 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

更新:我按照建议使用了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 %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

最佳答案

crypt()返回指向静态分配缓冲区的指针。每次调用crypt()都会覆盖上一个结果。
http://man7.org/linux/man-pages/man3/crypt.3.html
返回值指向其内容被重写的静态数据
每次通话。
在这种情况下,不需要您的malloc呼叫。事实上,您最终得到的是无法访问的内存,而您现在无法free,因为您使用crypt()的结果重写了指针

关于c - C没有为新的char数组分配内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56840612/

10-11 16:34