带指针的麻烦 - C.

时间:2017-01-06 13:15:12

标签: c arrays pointers

指针有问题。在程序中,我将所有单词放在数组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;

例如,我有foldersName = {"C","Game","Halo 4","Map"}。 但是,如果我printf tokens[i],就像我在for循环中所做的那样,则会打印此{"C","Game","Halo 4","Map?"}。怎么解决?

我可以在调用函数后在下一个代码中执行此操作吗?

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]);
  }

2 个答案:

答案 0 :(得分:1)

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

您在调用之前分配内存并不重要,因为您使用tokens返回的指针覆盖(重新分配)malloc返回的指针,从而导致内存泄漏。哦,getTokens无论如何也没有分配正确的金额,因为它只分配malloc字节(字符),而不是actualCountOfFolders指针字符。

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

答案 1 :(得分:0)

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

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

第二个代码是错误的,事实上通过使用malloc你在堆中分配内存并且一旦你调用行tokens = getTokens(path);   你用函数返回的地址覆盖堆地址,这将导致内存泄漏,因为我们松开了指向堆中已分配内存的指针,当然还没有提到当我们没有时丢失存储在函数堆栈中的数据的问题功能范围。