gpt4 book ai didi

c - C. 段错误中的 malloc(有时并不总是)

转载 作者:行者123 更新时间:2023-11-30 18:23:59 25 4
gpt4 key购买 nike

我的程序读取目录“./srcs/”中的所有文件,并生成找到的文件名称的数组。

然后我使用 main 中的数组和 switch 来对每个函数进行测试。

#include <dirent.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <stdlib.h>

void *ft_memset(void *dest, int c, size_t nofb);

char **show_dir_content(char * path)
{
DIR *dir;
struct dirent *ent;
struct dirent *entry;
char **array;
int i;
int len;

i = 0;
len = 0;

dir = opendir(path);
if(!dir)
{
perror("diropen");
return(0);
}

while((ent = readdir(dir)) != NULL)
{
if ((ent-> d_name[0]) != '.')
{
len++;
}
}
closedir(dir);
dir = opendir(path);
array = (char**)malloc(sizeof(*array) * len);
while ((entry = readdir(dir)) != NULL)
{
if ((entry-> d_name[0]) != '.')
{
array[i] = entry-> d_name;
i++;
}
}
closedir(dir);
return (array);
}

这是一个从目录读取文件并将它们放入数组的函数。想法是通过使用 switch 和 while 迭代函数的所有名称并执行测试。每个人都进行特殊测试。

为此,我使用下一个菜单:

int main(int argc, char **argv)
{
char c[6] = "123fg";
char d[6] = "123fg";
char **ptr;
int hack;
ptr = show_dir_content("./srcs/");

while(*ptr)
{
if(strcmp(*ptr, "ft_memset.c") == 0)
{
hack = 1;
}

switch (hack){
case 1:
ft_memset(c, 'A', 3);
memset(d, 'A', 4);
if(strcmp(c, d) == 0)
{
printf("%s", "OK");
}
else
{
printf("%s", "KO");
}

break;
}
ptr++;
}
free(ptr);
return(0);
}

作为测试,我使用 memset lib 函数与我自己创建的 ft_memset 函数。它有下一个代码:

#include <string.h>

void *ft_memset(void *dest, int c, size_t nofb)
{
unsigned char* p = dest;
while (nofb--)
*p++ = (unsigned char)c;
return (dest);
}

最佳答案

您不能依赖 entry 的内容继续存在于 readdir 循环之外。而且 array 的每个元素都将指向相同的字符串,因为 d_name 将是内存中的相同指针,只是每次使用不同的字符串。

替换

array[i] = entry->d_name;

array[i] = strdup(entry->d_name);

然后记住稍后释放数组的每个元素。

关于c - C. 段错误中的 malloc(有时并不总是),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47014663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com