2011-05-28 164 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