指针的问题-C

指针的问题-C,c,arrays,pointers,C,Arrays,Pointers,我对指针有问题。在程序中,我将所有单词放入数组foldersName[]。当我打印它们时,数组中的所有单词都是可以的,但我想返回指针数组,对于数组中的每个单词,一个指针。我的方法是: char** getTokens(char * path){ . .//Getting tokens in array foldersName[]; .char foldersName[count][255]; . char * tokens[actualCountOfFolders]; //How much fo

我对指针有问题。在程序中,我将所有单词放入数组
foldersName[]
。当我打印它们时,数组中的所有单词都是可以的,但我想返回指针数组,对于数组中的每个单词,一个指针。我的方法是:

char** getTokens(char * path){
.
.//Getting tokens in array foldersName[];
.char foldersName[count][255];
.
char * tokens[actualCountOfFolders]; //How much folders in foldersName
int i;
for(i=0;i<count;i++){
    tokens[i] = foldersName[i];
    printf("Folders pointer %s \n",tokens[i]);
  }
return tokens;

问题是您返回了一个指向局部变量的指针。当函数
getTokens
返回时,其所有变量都超出范围,不再存在。这也适用于数组
令牌

在调用之前分配内存并不重要,因为您使用
getTokens
返回的指针覆盖(重新分配)了
malloc
返回的指针,从而导致内存泄漏。哦,而且
malloc
无论如何都不会分配正确的数量,因为它只分配
actualcantoffolders
字节(字符),而不是
actualcantoffolders
字符指针的数量


两种典型的解决方案是在
getTokens
函数内动态分配,或者将数组作为参数传递给函数。

永远不要将函数内创建的局部变量的地址作为该函数的输出返回

有些人会说,因为清理工作将要完成,好吧,这并不完全是要发生什么。事实上,一旦在函数中创建了缓冲区,该缓冲区的起始地址将在该函数下面的堆栈中声明,因此整个缓冲区将存储在函数堆栈中,一旦完成函数并从中返回,数据仍然存在于堆栈地址中,但地址范围不再低于函数堆栈,因为我们是从函数调用完成的,因此如果调用了另一个函数,程序将为新调用或新声明的变量保留此地址范围作为结果缓冲区值将被覆盖,没有任何东西会阻止写入,这正是函数中声明的本地缓冲区或变量所发生的情况

第二个代码是错误的,事实上,通过使用malloc,您可以在堆中分配内存,并且一旦调用行
tokens=getTokens(path)

您使用函数返回的地址覆盖堆地址,这将导致内存泄漏,因为我们在堆中丢失了指向已分配内存的指针,当然没有提到当我们超出函数范围时丢失存储在函数堆栈中的数据的问题。

您不应返回指向内存的指针函数结束后将清除的自动变量。请参阅本讨论,为
malloc
标记留出一些空间,然后执行
tokens=getTokens(path)
您失去了对所分配内存的访问权限。与您的问题无关,但您可能希望读取。
标记
getTokens()
的本地标记,因此在函数返回时不再存在。因此,如果调用方使用返回值,则返回它会导致调用方具有未定义的行为。独立于此,您描述调用方所做的也是无效的。指针赋值不会复制整个数组。是的,我指的是局部变量的地址(即指向此局部变量的指针),而不是局部变量的值。非常感谢。
char ** tokens =(char **) malloc(sizeof(char)*actualCountOfFolders);
    tokens  = getTokens(path);
    int i = 0;
     for(i =0;i<actualCountOfFolders;i++){
     printf("Folders %s \n",tokens[i]);
  }