2011-05-28 208 views
0

我已閱讀所有關於此類問題的問題,但我無法修復我的問題。 的問題是,我使用的功能從文件中讀取數據,我得到這個錯誤: 「堆棧各地變量‘P’已損壞」 這是函數c堆棧變量​​損壞

Firm readFirm(char* name) 
{ 
FILE* file = NULL; 
int i = 0; 
Firm firm; 
char line[100]; 
char* p[5] = {(char*)malloc(50)}; 

char tmp[50]; 
strcpy(tmp,name); 
strcat(tmp,".txt"); 
file = fopen(tmp,"rb"); 

getline(file,line,100); 
strcpy(firm.name,line); 
getline(file,line,100); 
strcpy(firm.EIK,line); 
getline(file,line,100); 
split(p,line," "); 
for (i = 0 ; p[i] != NULL; i++) 
    firm.price[i] = atoi(p[i]); 
getline(file,line,100); 

split(p,line,"."); 
firm.day = atoi(p[0]); 
firm.month = atoi(p[1]); 
firm.year = atoi(p[2]); 
fclose(file); 
return firm; 

} 

請幫助,因爲我不噸知道如何解決它!

這是分割功能:

char ** split(char *result[], char *w, const char *delim) 
{ 
int i=0; 
char *p=NULL; 
for(i=0, result[0]=NULL, p=strtok(w, delim); p!=NULL; p=strtok(NULL, delim), i++) 
{ 
     result[i]=p; 
     result[i+1]=NULL; 
} 
return result; 
} 
+0

什麼是'的char * P [5] = {(字符*)malloc的(50)};'該怎麼辦? – 2011-05-28 16:47:54

+0

這是一個二維數組,我用它作爲分割函數 – 2011-05-28 16:49:53

+0

這是什麼:char * p [5] = {(char *)malloc(50)};',我想你想要類似auto初始化數組,例如'char arr [10] = {0};'這不行,因爲每個位置都需要單獨的內存地址。 – phoxis 2011-05-28 16:50:19

回答

5

聲明char* p[5] = {(char*)malloc(50)};有問題。它導致p[1],p[2],p[3]p[4]被初始化爲垃圾,很可能很少會是NULL,這是循環測試的內容。

使用getline()也存在問題,最值得注意的是參數順序錯誤且沒有充分間接。

+0

好,如何解決這個問題? – 2011-05-28 16:50:58

+0

@George我認爲OP真的需要一個'char *'數組。 – 2011-05-28 16:54:48

1

更改的行:

char* p[5] = {(char*)malloc(50)}; 

char *p[5]; 
int i=0, n=5; 

/* Allocate */ 
for (i=0; i<n; i++) 
{ 
    p[i] = malloc (sizeof (char) * 50); 
} 

/* Do work */ 

/* Deallocate */ 

for (i=0; i<n; i++) 
{ 
    free (p[i]); 
} 

EDIT1:

它看起來像你想實現的剩餘位置的默認分配就像我們可以用

char arr[10] = {0}; 

但在你的情況,你有

char *p[5]; 

併爲p每個位置需要哪些需要單獨指派/分配,並從上面一樣釋放/釋放一個單獨的存儲位置。

EDIT2:

在將拆分功能,你在做一件可怕的事情。如果您已將內存分配給p,然後將其傳遞給split函數,那麼爲什麼指針再次分配到p數組元素中。 p的每個元素都指向一個可用於保存字符串的整個數組(內存塊)。所以你應該複製字符串的部分到p[i]一些索引i,與strcpy

另外你爲什麼要返回數組?您已將它作爲指針傳遞,並且在函數中對其執行的所有修改將在返回後保留。

EDIT3:

下面是修改的拆分,通過應用最小修改代碼進行。

void split(char *result[], char *w, const char *delim) 
{ 
    int i=0; 
    char *p; 

    for(i=0, p=strtok(w, delim); p!=NULL; p=strtok(NULL, delim), i++) 
    { 
     strcpy (result[i], p); 
    } 
} 

下面是測試主要功能:

int main (void) 
{ 

    char arr[128] = "10.08.1989"; 
    char *p[5]; 
    int i, n = 5; 

    for (i=0; i<n; i++) 
    { 
    p[i] = malloc (sizeof (char) * 50); 
    } 

    split (p, arr, "."); 

    printf ("%s\n", p[0]); 
    printf ("%s\n", p[1]); 
    printf ("%s\n", p[2]); 


    for (i=0; i<n; i++) 
    { 
    free (p[i]); 
    } 
    printf ("\n"); 
    return 0; 
} 
+0

同樣的問題。在這個函數中,我使用變量兩次,當我分配'p'並且在再次使用它之前釋放分配內存時程序崩潰非常糟糕。 – 2011-05-28 16:59:10

+0

你想要一個動態分配長度爲50的'char'類型的數組嗎?或5個這樣的陣列,即2D陣列線結構。 – phoxis 2011-05-28 17:01:07

+0

好的我有一個例子,這個字符串「13.05.2009」,我必須將它分割成二維數組「13」,「05」,「2009」,並帶有一個分隔符「。」。這就是爲什麼我需要二維數組。 – 2011-05-28 17:04:09