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

时间:2014-12-15 10:51:00

标签: c linux function pointers

我有一个返回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]);

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

2 个答案:

答案 0 :(得分:1)

我想也许你不应该使用strncpy()。使用strcpy()。试试吧......同样,在malloc中分配+1。

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

另外,对于(i = 1; i <= 10; i ++)是错误的。循环从0到&lt; 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变为&lt;找到。如果您选择取消分配数组数组,则只调用从0到&lt;的插槽上的free()。找到。

答案 1 :(得分:0)

您正在为10个字符串分配内存:

malloc(10 * sizeof(char *));

...这意味着有效数组索引为0到(包括)9。特别是,10不是有效索引。尝试将循环调整为

for(i=0;i<10;i++)