C 不为新的 char 数组分配内存
C not allocating memory for new char array
我不明白下面的代码是如何工作的w.r.t。字符数组 cd2
被覆盖。我试图只为两个字符串分配 space,然后用 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);
}
输出 -
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 为数组分配了 space。 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()
returns 指向静态分配缓冲区的指针。每次调用 crypt()
都会覆盖之前的结果。
http://man7.org/linux/man-pages/man3/crypt.3.html
The return value points to static data whose content is overwritten by
each call.
在这种情况下,您的 malloc
电话是不需要的。事实上,你最终得到了无法访问的内存,你现在不能 free
因为你用 crypt()
的结果覆盖了指针
crypt()
函数有内存,每次调用都会覆盖之前的结果
为 'ss' 调用 crypt()
和 printf()
,然后为 '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);
}
我不明白下面的代码是如何工作的w.r.t。字符数组 cd2
被覆盖。我试图只为两个字符串分配 space,然后用 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);
}
输出 -
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 为数组分配了 space。 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()
returns 指向静态分配缓冲区的指针。每次调用 crypt()
都会覆盖之前的结果。
http://man7.org/linux/man-pages/man3/crypt.3.html
The return value points to static data whose content is overwritten by each call.
在这种情况下,您的 malloc
电话是不需要的。事实上,你最终得到了无法访问的内存,你现在不能 free
因为你用 crypt()
crypt()
函数有内存,每次调用都会覆盖之前的结果
为 'ss' 调用 crypt()
和 printf()
,然后为 '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);
}