我的代码在哪里泄漏?我需要如何编写 free() 函数? C
Where my code is leak? how i need to write free() function? C
此代码扫描数字,然后他使用 malloc 创建数组,然后我扫描字符串,然后我使用另一个 malloc 将其放入数组中,然后我对字符串进行排序并打印它们。我用 mallocs 构建这段代码,并将数组放在数组中,我在这段代码中有泄漏,我需要在哪里放置 free() 函数以及如何放置 free()?我尝试了很多次来解决这个漏洞,但它没有用。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void sort(char** names, int length);
void print_array(char** names, int length);
int main()
{
int num_of_friends = 0;
int i = 0;
char name[50] = { 0 };
char** names = NULL;
printf("Enter number of friends: ");
scanf("%d", &num_of_friends);
getchar();
names = malloc(sizeof(char) * num_of_friends);
for ( i = 0; i < num_of_friends; i++)
{
printf("Enter name of friend %d: ", i + 1);
fgets(name, 50, stdin);
name[strcspn(name, "\n")] = 0;
names[i] = malloc(sizeof(char) * strlen(name));
strcpy(names[i], name);
}
sort(names, num_of_friends);
print_array(names, num_of_friends);
getchar();
return 0;
}
void sort(char** names, int length)
{
char temp[50] = { 0 };
int i = 0;
int j_min = 0;
int j = 0;
for ( i = 0; i < length - 1; i++)
{
j_min = i;
for ( j = i+1; j < length; j++)
{
if (strcmp(names[j], names[j_min]) < 0)
{
j_min = j;
}
}
if (j_min != i)
{
strcpy(temp, names[i]);
strcpy(names[i], names[j_min]);
strcpy(names[j_min], temp);
}
}
}
void print_array(char** names, int length)
{
int i = 0;
for (i = 0; i < length; i++)
{
printf("Friend %d: %s \n", i + 1, names[i]);
}
}
对于 names
,您正在分配 sizeof (char)
倍于用户提供的字节数。这需要 sizeof (char *)
,为每个指针值提供足够的空间。
names = malloc(sizeof (char *) * num_of_friends);
您需要为空终止字符分配一个额外的字节 ('[=17=]'
)。 sizeof (char)
保证为 1
,使该声明变得多余。
names[i] = malloc(strlen(name) + 1);
在main结束之前,需要释放names
的每个元素,然后names
本身。
sort(names, num_of_friends);
print_array(names, num_of_friends);
getchar();
for (i = 0; i < num_of_friends; i++)
free(names[i]);
free(names);
return 0;
您的排序函数可能会尝试在不同大小的缓冲区之间复制字符串。您需要交换指针。
示例:
void swap(char **a, char **b) {
char *c = *a;
*a = *b;
*b = c;
}
void sort(char **names, size_t length) {
for (size_t i = 0; i < length - 1; i++)
for (size_t j = i + 1; j < length; j++)
if (strcmp(names[i], names[j]) > 0)
swap(names + i, names + j);
}
此代码扫描数字,然后他使用 malloc 创建数组,然后我扫描字符串,然后我使用另一个 malloc 将其放入数组中,然后我对字符串进行排序并打印它们。我用 mallocs 构建这段代码,并将数组放在数组中,我在这段代码中有泄漏,我需要在哪里放置 free() 函数以及如何放置 free()?我尝试了很多次来解决这个漏洞,但它没有用。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void sort(char** names, int length);
void print_array(char** names, int length);
int main()
{
int num_of_friends = 0;
int i = 0;
char name[50] = { 0 };
char** names = NULL;
printf("Enter number of friends: ");
scanf("%d", &num_of_friends);
getchar();
names = malloc(sizeof(char) * num_of_friends);
for ( i = 0; i < num_of_friends; i++)
{
printf("Enter name of friend %d: ", i + 1);
fgets(name, 50, stdin);
name[strcspn(name, "\n")] = 0;
names[i] = malloc(sizeof(char) * strlen(name));
strcpy(names[i], name);
}
sort(names, num_of_friends);
print_array(names, num_of_friends);
getchar();
return 0;
}
void sort(char** names, int length)
{
char temp[50] = { 0 };
int i = 0;
int j_min = 0;
int j = 0;
for ( i = 0; i < length - 1; i++)
{
j_min = i;
for ( j = i+1; j < length; j++)
{
if (strcmp(names[j], names[j_min]) < 0)
{
j_min = j;
}
}
if (j_min != i)
{
strcpy(temp, names[i]);
strcpy(names[i], names[j_min]);
strcpy(names[j_min], temp);
}
}
}
void print_array(char** names, int length)
{
int i = 0;
for (i = 0; i < length; i++)
{
printf("Friend %d: %s \n", i + 1, names[i]);
}
}
对于 names
,您正在分配 sizeof (char)
倍于用户提供的字节数。这需要 sizeof (char *)
,为每个指针值提供足够的空间。
names = malloc(sizeof (char *) * num_of_friends);
您需要为空终止字符分配一个额外的字节 ('[=17=]'
)。 sizeof (char)
保证为 1
,使该声明变得多余。
names[i] = malloc(strlen(name) + 1);
在main结束之前,需要释放names
的每个元素,然后names
本身。
sort(names, num_of_friends);
print_array(names, num_of_friends);
getchar();
for (i = 0; i < num_of_friends; i++)
free(names[i]);
free(names);
return 0;
您的排序函数可能会尝试在不同大小的缓冲区之间复制字符串。您需要交换指针。
示例:
void swap(char **a, char **b) {
char *c = *a;
*a = *b;
*b = c;
}
void sort(char **names, size_t length) {
for (size_t i = 0; i < length - 1; i++)
for (size_t j = i + 1; j < length; j++)
if (strcmp(names[i], names[j]) > 0)
swap(names + i, names + j);
}