2012-11-24 30 views
2

我不明白爲什麼整個事情都不起作用。malloc在函數中效果不好

我只想做malloc在功能func,當我從它返回時,malloc消失......我得到

* glibc的檢測 ./test:免費():無效指針:0xb76ffff4 * *

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 

#include <string.h> 
#include <errno.h> 

int func(char *p) { 
    p=(char*)malloc(1); 
    *p='a'; 
    printf("1. p= %c\n",*p); 
    return 0; 
} 

int main() 
{ 
    char *p; 

    func(p); 
    printf("2. p= %c\n",*p); 
    free(p); 

    return 0; 
} 
+0

您試圖釋放無效指針。 'p'只是指針的一個副本。 – Maroun

+1

C是[按值調用](http://en.wikipedia.org/wiki/Evaluation_strategy),其中有一個怪異的問題,當您將它們傳遞給函數時,它會變成指針。 –

+0

通常在C中分配內存,然後傳遞給使用它的函數,然後在分配它的相同函數中釋放內存。 – LtWorf

回答

4
char *p; 

使指針局部於main(),您可以將它傳遞給另一個函數,但是您可以通過值傳遞它,所以您對其作出的任何更改(如更改它指向的內容)都在範圍之外。不會「粘」。

的解決方案是將指針傳遞給p的指針,或者乾脆地址:

func(&p); 

但不要忘記更改FUNC的參數列表()!

int func(char **p) 
+0

在c和C++中這個東西有什麼區別嗎?也許這是讓我困惑的事情?因爲我不記得我曾經這樣做過 – hudac

+0

@hudac - 挑戰! C++有一個「通過引用傳遞」的概念,這個技術在C中不存在,「解決方法」是傳遞一個變量的地址(如本例中所示) – user1712704

+0

是的..那是我的問題..謝謝! – hudac

3

而在FUNC,p爲你傳遞給它的指針的一個拷貝,因此p爲c func完成後,在func內部重新編譯並刪除。

有兩種解決方法:

  1. 傳遞一個指針的指針,一個char ** p和做*p = malloc(1),然後FUNC將接受一個char ** P
  2. 返回的alloced變量未FUNC併爲其分配:p = func();
+0

與c和C++中的這個東西有什麼不同嗎? 也許這是讓我困惑的事情?因爲我不記得我曾經這樣做過 – hudac

+0

在C++中,您仍然可以訪問malloc()函數,但是您必須使用適用於對象的C++「new」運算符語法。 – Intrepidd

3

&p在主裝置調用FUNC作爲func(&p) 變化func(char *p)到功能sugnature

funcp是當地的一個到func所以當func退出它摧毀,也導致內存泄漏。

而且在主你釋放未被指向由malloc分配的內存的指針,calloc所以free(p)在這種情況下Undefined behaviour,它不是釋放您在func已分配所以它的內存泄露

內存第一個方法:

void func(char **p) 
{ 
*p=malloc(1); 
//rest of your code here 
} 

int main() 
{ 
int *p; 
func(&p); 
// your code here 
free(p); 
} 

第二個方法:這很容易沒有用的**

char * func(char *p) 
{ 
p=malloc(1); 
// rest of code here 
return p; 
} 

int main() 
{ 
char *p; 
p=func(p); 
//rest of code here 
free(p); 
} 
+0

只有當我將「p」設置爲「char p」而不是「char * p」時,我才應該做「func(&p)」? – hudac

+2

如果funcs接受char ** p,p是char *,那麼&p將是char **,所以這很好。 – Intrepidd

+0

@Intrepidd:是啊與你同意 – Omkant