2016-03-30 63 views
-5

我將內存分配給指向它可能具有的最大字符大小的指針。 然後,我不得不編寫代碼,它將根據從文件中讀取的值更改其值,並且我需要知道指針中的值的長度是多少,所以我使用了strlen()函數。strlen和空閒內存

我得到了我需要的東西。 當我試圖釋放該指針的內存時發生問題。該程序崩潰了,我假設我正在做一些「迴腸」,並想知道爲什麼以及如何解決它。

這裏是代碼的一部分:

char *StudID = (char*)malloc(sizeof(char)*15); 
char *StudIDcpy = (char*)malloc(sizeof(char) * 15); 
fread(stud[i].ID, sizeof(char), 4, in); 
stud[i].ID[4] = '\0'; 
IDtemp = atoi(stud[i].ID);//convert ID string to integer and store value in IDtemp 
StudIDcpy = itoba(IDtemp);//convert integer to binary number as a string 
strcpy(StudID, StudIDcpy); 
IDtemp = strlen(StudIDcpy); 
free(StudIDcpy); // <---- I BELIEVE THIS IS WHERE IT CRASHES 

這裏是我的itoba()功能:

char *itoba(int a){ 
    int i = 0, j; 
    char temp[15]; 
    while(a){ 
     if (a % 2)temp[i] = '1'; 
     else temp[i] = '0'; 
     i++; 
     a = a/2; 
    } 
    temp[i] = '\0'; 
    for (j = 0; j < i/2; j++)swapc(&temp[j], &temp[i - j-1]); 
    return temp; 
} 

當我知道我沒有寫sizeof(char),因爲它等於1的方式,但我反正寫它,所以我記得應該在那裏放置什麼樣的價值。

+0

方便查看'itoba'的代碼 –

+0

我添加了代碼itoba – Dani

+2

'return temp;'返回一個指向局部變量的指針,當函數退出時它會消失。 –

回答

1

在您的itoba()函數temp中,將返回一個本地數組,它將衰減爲指向局部變量的指針。

函數返回後,其局部變量立即「釋放」,允許其他人重新使用這些內存空間。因此,它們所持有的值很快將被堆棧中的其他值所覆蓋。

可以重寫itoba()這樣的:

char *itoba(int a) 
{ 
    int i = 0, j; 
    char *temp = malloc(15); // <--- This line is different 
    while(a){ 
     if (a % 2) 
      temp[i] = '1'; 
     else 
      temp[i] = '0'; 
     i++; 
     a = a/2; 
    } 
    temp[i] = '\0'; 
    for (j = 0; j < i/2; j++) 
     swapc(&temp[j], &temp[i - j -1]); 
    return temp; 
} 

BTW:你應該刪除char *StudIDcpy = (char*)malloc(sizeof(char) * 15);,因爲malloc()返回指針值後來被itoba(IDtemp);丟棄。因此,此malloc()分配給StudIDcpy的內存將永遠不會被釋放,從而導致內存泄漏。