gpt4 book ai didi

c - 函数返回指向字符串的指针

转载 作者:太空宇宙 更新时间:2023-11-04 10:59:37 24 4
gpt4 key购买 nike

我有一个返回 char** 的函数,即指向字符数组的指针。在这里,我正在为特定整数值 ind 读取目录数中的文件。如果它在文件中找到值,它应该返回目录的名称。我尝试使用静态分配,但它无济于事,因为返回这些变量会导致未定义的行为。在我的例子中,我得到了与最后一个目录名称相同的所有值。这可能是因为我正在从分配的系统堆栈中读取。然后我使用了动态分配,这是我编写的代码:

//Global variable
int found = 0;

char** get_strings(int ind)
{
FILE *fp;
char filename[64];
char name[16];
//char *name;
char **array;
int i = 0, found = 0, l = 0;
int val = 0;

char **array = (char **)malloc(10 * sizeof(char *));
for(l = 0; l < 10; l++)
array[l] = (char *)malloc(16 * sizeof(char));

//name = (char *)malloc(16 * sizeof(char));

for(i=1;i<=10;i++)
{
snprintf(filename, sizeof(char) * 64, "/home/ben/dir%d/name", i);
fp = fopen(filename, "r");

if(fp == NULL)
{
perror("Error opening file");
}
fscanf(fp, "%d", &val);
fclose(fp);
//printf("value-%d is %d\n", i, val);

if (val != 0 && val == ind)
{
snprintf(name, sizeof(char) * 16, "dir%d", i);

printf("Dir %s is a has %d\n", name, ind);
strncpy(array[found],name, strlen(name));
found++;
}
}
return array;
}

我在主函数中调用它:

int i = 0;
char **array;
array = get_strings(1);
for(i=0;i< found;i++)
printf("array[%d] = %s\n", i, array[i]);

我在输出中得到垃圾值。有人可以帮忙吗?

最佳答案

我想也许你不应该使用 strncpy()。使用 strcpy()。尝试一下...另外,在 malloc 中分配 + 1。

原因:malloc 分配的内存没有预初始化为全零。所以,你的字符串可能没有正确终止,当你调用 printf 时它会溢出。除了要存储的 16 个实际字符之外,我建议的额外 +1 只是存储所需的空字节。

此外,for(i=1;i<=10;i++) 是错误的。从 0 循环到 < 10,然后在你的 snprintf 中,使用 i + 1。

编辑:顺便说一句,有一个函数 strdup() 将分配一个字符串。要使用它,我建议:

1/分配你的数组:

char **array = calloc(10, sizeof(char *));

这会将所有成员预初始化为 NULL,因此您无需预分配字符串或将 NULL 放入槽中。这使得它准备好:

2/如果要存储字符串,请使用 strdup() 复制字符串:

if(conditions are ripe)
array[found++] = strdup(name);

现在,您的循环将从 0 到

关于c - 函数返回指向字符串的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27482385/

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