我有一个返回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]);
我在输出中得到垃圾值。有人可以帮忙吗?
答案 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++)